Qt Vs addin - 不为 moc_*.cpp 文件生成 .obj 文件
Posted
技术标签:
【中文标题】Qt Vs addin - 不为 moc_*.cpp 文件生成 .obj 文件【英文标题】:Qt Vs addin - .obj files are not generated for moc_*.cpp files 【发布时间】: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 的头文件,它们就会自动添加。
【参考方案1】:
在 Sloution Explorer 中,检查
生成的文件
调试(或发布发生的错误)
moc_[yourErrorFile].cpp
右键查看属性
如果 General->Exclude From Build 为 True 将其更改为 False
这是发生错误的一种可能性
【讨论】:
【参考方案2】:@newdazhu 正在做某事。
我刚刚遇到过类似的情况,项目中的一些(但不是全部)类具有未解析的成员函数。原来这是因为缺少一些目标文件(对于 moc'ed 类)。这些又没有被构建,因为它们被排除在当前配置的构建之外。
在我的情况下,它们被排除在调试和发布配置的构建之外。这通常是一个错误,除非有问题的源文件最后包含一个 moc_*.cpp 文件(这是 Qt 内部经常使用的一种技术,因此您可以在源文件中包含例如信号/插槽)。在这种情况下,您实际上必须排除这两种/所有配置,否则您会得到一个多重定义的错误(moc_*.cpp 已经编译到另一个目标文件中)。
【讨论】:
【参考方案3】:这是由于项目文件夹中的空间... 我的项目/
重命名为 我的项目/
这就是大家...
【讨论】:
问题中没有名为“我的项目”的文件夹。当 OP 说“我的项目”时,他们的字面意思是他们的项目。以上是关于Qt Vs addin - 不为 moc_*.cpp 文件生成 .obj 文件的主要内容,如果未能解决你的问题,请参考以下文章