我正在使用带有qt addin的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文件不能删除,是真的吗?
答案 0 :(得分:0)
在Sloution Explorer中,选中
生成的文件
调试(或发布哪个错误感兴趣)
moc_[yourErrorFile].cpp
右键单击以查看属性
如果General-&gt;从Build中排除为True将其更改为False
这是一种可能发生错误的可能性
答案 1 :(得分:0)
@newdazhu正在做点什么。
我刚刚遇到过类似的情况,项目中的某些类(但不是所有类)都有未解析的成员函数。原来这是因为一些丢失的目标文件(对于moc&#39; ed类)。反过来这些都没有构建,因为它们被排除在当前配置的构建之外。
在我的情况下,他们被排除在构建之外,用于调试和发布配置。这通常是一个错误,除非有问题的源文件最后包含一个moc _ * .cpp文件(这是Qt内部经常使用的一种技术,所以你可以在源文件中有例如信号/插槽)。在这种情况下,您实际上必须排除两个/所有配置,否则您将获得多重定义的错误(moc _ * .cpp已经编译到另一个目标文件中)。
答案 2 :(得分:-1)
这是由于项目文件夹中的空间... 我的项目/
重命名为 我的项目/
那是所有人......