更新 2
少しいじった後 (および生成された Makefile を編集した後)、moc が適切に処理されていないように見えますMainWindow.h
(インクルードされたソース ファイルと同じフォルダーにない限りmain.cpp
、 moc によってインクルードされます)。MainWindow.cpp
Moc は で実行されMainWindow.cpp
、インクルードを処理しないため、Q_OBJECT マクロが表示されないため、空の出力ファイルの生成に進みます。moc が通常インクルードを処理するのか、ディレクトリをスキャンするだけなのかはわかりませんが、いずれにせよ、mocing が必要であるが他のディレクトリにあるヘッダーは処理されていません!
アップデート
この問題は、moc によって生成される出力に関連しているようです。最初のケース (コンパイルされたもの) ではhello-world_automoc.cpp
、moc_MainWindow.cpp
生成されます。hello-world_automoc.cpp
のように見える
/* This file is autogenerated, do not edit*/
#include "moc_MainWindow.cpp"
2 番目のケースでhello-world_automoc.cpp
は、次のような a が生成されます。
/* This file is autogenerated, do not edit*/
enum some_compilers { need_more_than_nothing };
そして、まったくありませんmoc_MainWindow.cpp
。壊れた場合にautomocを使用する代わりにcmakeからmocを手動で呼び出すと、取得できますmoc_MainWindow.cpp
が空です。
元のステータス
まず、いいえ、忘れていませんset(CMAKE_AUTOMOC ON)
。また、デストラクタが宣言され、実装されMainWindow
ていることにも注意してください。
ディレクトリ構造が次のようになっている場合:
CMakeLists.txt |__ main.cpp |__ MainWindow.cpp |__ MainWindow.h |__ MainWindow.ui
コンパイルは問題なく動作します。
ただし、次のように見える場合:
こんにちは世界/ |__ CMakeLists.txt |__ src/ | | |__ CMakeLists.txt | | |__ main.cpp | | |__ MainWindow.cpp | | |__ inc/ | | |__ MainWindow.h | | |__グイ/ |__ MainWindow.ui
リンク エラーが発生します。
Linking CXX executable hello-world
CMakeFiles/hello-world.dir/MainWindow.cpp.o: In function `MainWindow::MainWindow()':
MainWindow.cpp:(.text+0x3b): undefined reference to `vtable for MainWindow'
MainWindow.cpp:(.text+0x4d): undefined reference to `vtable for MainWindow'
CMakeFiles/hello-world.dir/MainWindow.cpp.o: In function `MainWindow::~MainWindow()':
MainWindow.cpp:(.text+0xaf): undefined reference to `vtable for MainWindow'
MainWindow.cpp:(.text+0xc1): undefined reference to `vtable for MainWindow'
collect2: error: ld returned 1 exit status
make[2]: *** [src/hello-world] Error 1
make[1]: *** [src/CMakeFiles/hello-world.dir/all] Error 2
ソースとヘッダーを適切なサブディレクトリに配置したいのですが、これを修正する方法がよくわかりません。
これは実際には、はるかに大きなプロジェクトからのエラーの最も単純な識別可能なケースであるため、Qt GUI を追加するという理由だけで、プロジェクト ディレクトリをフラット化することにそれほど熱心ではありません。