0

我正在使用带有 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 文件一定不能删除,是真的吗?

4

3 回答 3

0

@newdazhu 正在做某事。

我刚刚遇到过类似的情况,项目中的一些(但不是全部)类具有未解析的成员函数。原来这是因为缺少一些目标文件(对于 moc'ed 类)。这些又没有被构建,因为它们被排除在当前配置的构建之外。

在我的情况下,它们被排除在调试和发布配置的构建之外。这通常是一个错误,除非有问题的源文件最后包含一个 moc_*.cpp 文件(这是 Qt 内部经常使用的一种技术,因此您可以在源文件中包含例如信号/插槽)。在这种情况下,您实际上必须排除两个/所有配置,否则您会得到一个多重定义的错误( moc_*.cpp 已经编译到另一个目标文件中)。

于 2016-09-01T10:28:56.990 回答
0

在 Slution Explorer 中,检查

生成的文件

调试(或发布发生的错误)

moc_[yourErrorFile].cpp 

右键单击它以查看属性

如果 General->Exclude From Build 为 True 将其更改为 False

这是发生错误的一种可能性

于 2016-03-01T07:09:39.950 回答
-1

这是由于项目文件夹中的空间......我的项目/

重命名为我的项目/

这就是所有人...

于 2017-07-21T11:13:53.390 回答