【发布时间】:2015-02-11 13:24:40
【问题描述】:
我正在使用带有 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文件一定不能删除,是真的吗?
【问题讨论】:
-
通常情况下,如果您正确安装了 Qt VS 插件并且您的项目定义为 Qt 项目,添加包含 Q_OBJECT 声明的头文件会自动将相应的 moc_*.cpp 添加到
Generated Files文件夹该项目。也许您的项目应该转换为 Qt Add-in 项目? -
没有项目是Qt插件项目并且moc_.cpp文件生成到Generated Files文件夹,生成没有问题。问题是生成的 moc_.cpp 文件未包含在项目中,因此未编译,并且由于缺少 obj 文件而发生这些错误。
-
一般情况下,你需要将文件添加到项目中进行编译...使用qt在第一次创建后将生成的moc文件添加到项目中是正常的。
-
是的,这是我找到的解决方案,但是当 moc_*.cpp 文件从一个配置中删除时,当我尝试从另一个配置中构建时,构建停止,因为已删除的 moc 文件已添加到项目中,但确实不存在
-
@AkınYılmaz,奇怪。对我来说,只要我添加新的基于 Qt 的头文件,它们就会自动添加。
标签: c++ visual-studio qt moc