信号とスロットに関する未定義の参照リンカー エラー
-
26-09-2019 - |
質問
Qt Creator を使用して、Qt でカスタム スロットを持つクラスを作成しています。
class CustomEdit : public QTextEdit
{
Q_OBJECT
public:
CustomEdit(QWidget* parent);
public slots:
void onTextChanged ();
};
ただし、次のリンカー エラーが発生します。
undefined reference to 'vtable for CustomEdit'
ドキュメントには次のように書かれています。
「LcdNumber の vtable への参照が未定義です」という内容のコンパイラ エラーが発生した場合は、moc を実行するか、リンク コマンドに moc 出力を含めるのを忘れている可能性があります。
...しかしそれが何を意味するかは明らかではありません。
クラスまたは .pro ファイルに何か追加する必要があるものはありますか?
編集 -- これが私の .pro ファイルです。
QT += network \ script \ webkit \ xml TARGET = MyApp TEMPLATE = app SOURCES += main.cpp \ MainWindow.cpp \ CustomEdit.cpp HEADERS += MainWindow.h \ CustomEdit.h FORMS += mainwindow.ui
編集:
この質問 も同じ問題を扱っていますが、Qt Creator でこの問題を解決する方法が明確ではありません。moc で生成された .cpp ファイルをリンクするファイルのリストに明示的に追加する必要がありますか?それは苦痛のようです。
解決
Qt Creator は、Qt プロジェクトの作成に使用される IDE です。それだけです。しかし、qmake を使用するとプロジェクトをビルドできます。から qmakeマニュアル,
qmake は Makefile の生成を自動化するため、各 Makefile の作成に必要な情報は数行だけです。qmake は、プロジェクト ファイル内の情報に基づいて Makefile を生成します。qmake には、Qt での開発をサポートする追加機能が含まれており、moc および uic のビルド ルールが自動的に組み込まれます。
moc ファイルを個別にインクルードする必要はありませんが、必要な moc ファイルに関するすべての情報を含む qmake を実行する必要があります。生成されたものを見てください Makefile.debug
または Makefile.release
qmake を実行すると、すべての moc ファイルが含まれていることがわかります。
Qt Creator で qmake を実行するには、次の場所に移動します。 Build->RebuildAll
これにより、qmake が実行され、すべての (moc) ファイルが生成され、(Makefile.debug 内で) リンクされます。
これにより、未定義の参照が排除されることを願っています。