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&apos;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 文件的主要内容,如果未能解决你的问题,请参考以下文章

解决VS+Qt不生成moc文件问题

如何解决VS+Qt不生成moc文件问题

qt4+vs2010 环境搭建

Qt5 moc没有生成文件

VS2013平台安装Qt插件过程

QT5 && VS2013配置