我使用Qt 5.3 qmake
生成Visual Studio 2013项目。在我的.pro
文件中,我收到了以下内容:
MOC_DIR = $$BUILD_DIR/<DEBUG OR RELEASE>/moc
如果我message($$MOC_DIR)
,则路径正确形成。但是,当我在VS中构建时,moc_<CLASS>.cpp
文件不会在该位置生成,而是最终位于与.pro
相同的目录中。编译期间我收到以下警告:
两个或多个名称为
moc_<CLASS>.cpp
的文件将生成到同一位置的输出
这并不奇怪,因为如果我查看生成的.vcxproj
的内容,我会看到以下内容(不相关的标签/文字省略...
):
<CustomBuild Include="..\include\Class.hpp">
...
<Outputs Condition="...Release...">moc_Class.cpp;%(Outputs)</Outputs>
...
<Outputs Condition="...Debug...">moc_Class.cpp;%(Outputs)</Outputs>
...
</CustomBuild>
为什么我的自定义MOC_DIR
被忽略?
答案 0 :(得分:0)
使用Qt5生成的其他VS2013项目qmake
将moc_<CLASS>.cpp
个文件放在指定的位置,正如预期的那样,所以我怀疑.pro
中的其他内容正在干扰。
我使用Boost(1.55)并在将Boost添加到项目中时,我遇到了此SO问题中描述的问题:link。
我将以下几行添加到.pro
的顶部:
load(moc)
QMAKE_MOC += -DBOOST_MPL_IF_HPP_INCLUDED
...这解决了我的宏参数不匹配错误。它还导致了这里描述的错误。由于某种原因,在设置load(moc)
之前调用MOC_DIR
会导致qmake
忽略自定义MOC_DIR
。如果您将load(moc)
重新排序为在设置MOC_DIR
之后,一切都按预期工作。
我的.vcxproj
现在看起来应该是这样,我的moc_<CLASS>.cpp
文件现在放在正确的<BUILD>/debug/moc
或<BUILD>/release/moc
目录中。
但是:我仍然收到相同的MSB8027
版本警告。这似乎是Visual Studio中的known bug。但是,由于我在添加load(moc)
时只打破了moc位置,因此我对此情况感到困惑,但是在问题出现之前我得到了警告,虽然它已经存在,现在甚至在它被修复之后!现在我禁用警告;见Felix Huang的回答here。