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 をコンパイルしたり、自動的にインクルードしたりしますか?

注: 新しい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 ファイルは削除してはいけません。それは本当ですか?

4

3 に答える 3

0

Sloution Explorer で、チェックします。

生成されたファイル

デバッグ(またはエラーが発生したリリース)

moc_[yourErrorFile].cpp 

それを右クリックしてプロパティを表示します

General->Exclude From Build が True の場合、False に変更します

これは、エラーが発生する 1 つの可能性です

于 2016-03-01T07:09:39.950 に答える
0

@newdazhu は何かに取り組んでいます。

プロジェクト内のすべてではないが一部のクラスに未解決のメンバー関数があるという同様の状況が発生しました。これは、いくつかのオブジェクト ファイルが欠落していることが原因であることが判明しました (moc 化されたクラスの場合)。これらは、現在の構成のビルドから除外されたため、ビルドされませんでした。

私の場合、デバッグ構成とリリース構成の両方でビルドから除外されました。問題のソース ファイルの最後に moc_*.cpp ファイルが含まれていない限り、これは通常エラーです (Qt の内部でよく使用される手法なので、ソース ファイルにシグナル/スロットなどを含めることができます)。その場合、実際には両方/すべての構成を除外する必要があります。そうしないと、複数定義エラーが発生するためです (moc_*.cpp は既に他のオブジェクト ファイルにコンパイルされています)。

于 2016-09-01T10:28:56.990 に答える