私は 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 をコンパイルしたり、自動的にインクルードしたりしますか?
注: 新しいqtヘッダーがプロジェクトファイルに追加されたときに何が起こるかを確認するために、試用版の.hファイルを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 ファイルは削除してはいけません。それは本当ですか?