使用qmake生成Visual Studio项目时,为什么忽略了我的MOC_DIR

时间:2014-06-05 23:49:48

标签: visual-studio qt visual-studio-2013 qmake moc

我使用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被忽略?

1 个答案:

答案 0 :(得分:0)

使用Qt5生成的其他VS2013项目qmakemoc_<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