我有几个使用 Qt Visual Studio 工具创建的 Visual Studio 项目(始终是项目创建时可用的最新版本,有些可以追溯到支持 Qt 5 的第一个版本,现在是 2.2.1)。所有项目都是用 VS 2010 编译的,尽管 IDE 是 VS 2017(到目前为止是 15.7.4)。
从一段时间开始,一些项目开始报告链接错误,例如
错误 LNK2001:未解析的外部符号“公共:静态结构 QMetaObject const MyQtClass::staticMetaObject”(?staticMetaObject@MyQtClass@@2UQMetaObject@@B)
对于此示例,MyQtClass.h
文件声明MyQtClass
并具有Q_OBJECT
宏。MyQtClass.cpp
定义方法。
经过快速检查后,我发现问题来自关联的 moc'ed 文件(moc_MyQtClass.cpp
例如上面的示例)被排除在当前配置的编译之外。这里是 .vcxproj 文件的摘录:
<ClCompile Include="GeneratedFiles\Debug\moc_MyQtClass.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_MyQtClass.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
</ClCompile>
如果我修改 .vcxproj 文件以从调试配置中删除排除项,则该项目可以工作。
该问题仅在修改与 ed 类关联的主.cpp 文件时发生(在我的示例中)。保存此类文件时,会使用排除项修改 .vcxproj 文件。Q_OBJECT
MyQtClass.cpp
这个问题不会出现在我拥有的每个 Qt 项目中,但是一旦启动,每次修改关联的 .cpp 文件时都会出现此问题。我还没有找到它的模式。另外,公司的几个开发系统都出现这种情况,所以好像不是我电脑的问题。
我发现的唯一解决方法是丢弃项目文件中的更改,但是每次修改这些文件时丢弃并重新启动项目是一件令人头疼的事情(这恰好是很多次)。
有没有人遇到过同样的问题?任何想法如何解决它?
更新:仅当修改后的文件是与头文件(MyQtClass.cpp
在我的示例中)具有相同基本名称的 .cpp 文件时,才会出现此问题。如果我修改了另一个也定义了MyQtClass
类的更多方法的文件(例如MyQtClass_more_definitions.cpp
),则不会给出错误。
由于它似乎是 Qt Visual Studio Tools 中的一个错误,没有解决方法,我已经在QTVSADDINBUG-555下报告了它。