web-dev-qa-db-ja.com

QtCreatorプロジェクトの「アーキテクチャx86_64のシンボルが見つかりません」

エラーが発生しています

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にこの行があれば、エラーが表示されます。

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

22
MaiaVictor

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

Symbol(s) not found for architecture x86_64

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

IssuesからCompile Outputウィンドウに変更して上にスクロールすると、どのシンボルが見つからないかを正確に確認できます。鉱山は赤で表示されます。欠落しているシンボルの詳細がIssuesビューに表示されないのは、単に迷惑です。

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

symbol not found

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

enter image description here

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

45
TheDarkKnight

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

ただし、シンボルの重複(分割した理由)の問題がまだ残っていました。今回は、.hexternalとして変数を宣言し、1つの(唯一の).cppファイルでexternalキーワードなしで変数を再宣言すると、良い。

8
MaiaVictor

私にとってこの問題は、別のソースファイルとヘッダーを追加した後、メイクファイルを再構築しないために発生しました。

Build:Cleanall-> run qMake-> runの下で

私のためにエラーを修正しました。

2
user5482467

私の場合の問題は、多くのサブプロジェクトを持つプロジェクトがあり、サブプロジェクトのプロファイルの1つが空だったことです。

0
Matthias

私にとっては、.cppファイルで関数を宣言するときにクラスオブジェクトの名前を書くのを忘れていました。

間違っている:int Zero(int &num)

右:int Common2::Zero(int &num)

Common2はクラスです。

0
Cheng