我正在使用带有 qt 插件的 Visual Studio,当我构建我的项目时,它会根据我的项目中的构建规则生成 moc_*.cpp 文件:
<Tool
Name="VCCustomBuildTool"
Description="Moc'ing $(InputFileName)..."
CommandLine="$(QTDIR)\bin\moc.exe $(InputPath) -o .\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp (continues..)
AdditionalDependencies="$(QTDIR)\bin\moc.exe;.\myfilewithqobject.h"
Outputs=".\GeneratedFiles\$(ConfigurationName)\moc_myfilewithqobject.cpp"/>
生成 moc_myfilewithqobject.cpp 后,它继续构建项目并在链接阶段给出 LINK 2001 错误:
unresolved external symbol "public: virtual struct QMetaObject const * __thiscall myfilewithobject::metaObject(void)const
unresolved external symbol "public: virtual void * __thiscall myfilewithobject::qt_metacast(char const *)
unresolved external symbol "public: virtual int __thiscall myfilewithobject::qt_metacall
因为它找不到文件 moc_myfilewithobject.obj。moc_myfilewithobject.obj 没有生成,因为 moc_myfilewithobject.cpp 生成后没有编译。但是,当我将 moc_myfilewithobject.cpp 包含到我的项目中时,它会被编译并解决问题。但这是手工完成的,有时会导致一些问题。有没有办法在不包括 moc_ .cpp 文件手动项目的情况下解决这个问题?就像在生成后编译 moc_ .cpp 还是自动包含它?
注意: 我添加了一个试用 .h 文件作为 qt 类,以查看在项目文件中添加新的 qt 标头时会发生什么。它添加了不属于我的有问题的文件的行:
<ClCompile Include="GeneratedFiles\Debug\moc_Denemeqt.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
</ClCompile>
所以我认为这是一个真正的配置,但是我之前作为qt类创建的文件没有这样的配置。但是,当我删除 GeneratedFiles 中的 Debug 文件夹时,它会给出相同的错误,因为当我删除 Debug 文件夹时,moc_ .cpp 文件也会从项目文件中删除。那么问题来了:生成的 moc_ .cpp 文件一定不能删除,是真的吗?