29

エラーが発生します

Symbol(s) not found for architecture x86_64

QtCreator でプロジェクトをコンパイルしようとしています。ユーザー定義クラスのインスタンスを作成しようとすると発生しますLayer。そのクラスは、ヘッダーlayer.hと実装 で構成されlayer.cppます。テスト済みで、別のプログラムで動作します。私のプロジェクトでは に含まれてqtwidget.hおり、 で使用しようとするとエラーが発生しますqtwidget.cpp。例えば:

Layer<double> text("pq.txt",0.5,0.5,0.5);

この行をオンqtwidget.cppにすると、エラーが表示されます。

これは非常に一般的なエラーであるため、これ以上分離する方法がわかりませんが、役立つ場合は、プロジェクト全体をこの git repoに含めました。

4

5 に答える 5

53

私の意見では、Qt Creator が表示するエラー メッセージは、理解するまで誤解を招きやすいものですが、テンプレート クラスをヘッダーと実装ファイルに分割することを妨げるものではありません。メッセージについて考える場合:

Symbol(s) not found for architecture x86_64

問題は、これを見たときに最初に考えたのですが、問題の出力にこのエラーが単独で表示され、問題がアーキテクチャにあるとユーザーに思わせる可能性があることです。実際には、一致する実装が見つからなかった定義済みのシンボル (多くの場合、関数) があるということだけです。

[ Issue ]から [ Compile Output ] ウィンドウに変更して上にスクロールすると、見つからないシンボルを正確に確認できます。私のは赤で表示されます。不足しているシンボルの詳細が問題ビューに表示されないのは面倒です。

関数定義をヘッダーに追加し、関数を実装せずに .cpp ファイルから呼び出すだけで、このエラーを再現するのは簡単です。[問題] ウィンドウに次のようなものが表示されます。

シンボルが見つかりません

[コンパイル出力] ビューに切り替えて上にスクロールすると、次のように表示されます。 -

ここに画像の説明を入力

これで、実際の問題は、PGGui というクラスの関数 DoSomeStuff がコンストラクター PGGui::PGGui から呼び出されていることですが、シンボルが見つからないため、DoSomeStuff の本体が欠落していることがわかります。

于 2013-09-24T10:08:23.970 に答える
8

幸いなことに、回答の前に問題を解決できたので、誰かが同様のことを経験している場合、問題は、テンプレート化されたクラスを .cpp と .h ファイルに分割できないように見えることでした。.cppファイルのすべての宣言を.h解決した問題に戻します。

ただし、まだ問題が残っていました: シンボルの重複 (これが分割の理由でした)。今回は、 のように変数を宣言しexternal、キーワードなしで 1 つの (そして 1 つのみの)ファイルで変数を再宣言すると、問題は完全に解決されました.hexternal.cpp

于 2013-09-24T06:11:41.080 に答える