エラーが発生しています
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 に含めました。
私の意見では、Qt Creatorが表示するエラーメッセージは理解するまで誤解を招く可能性がありますが、テンプレートクラスをヘッダーファイルと実装ファイルに分割することを妨げません。メッセージについて考える場合:
Symbol(s) not found for architecture x86_64
問題は、私が最初にこれを見たときに考えたのは、Issues出力でこのエラーを単独で述べ、問題がアーキテクチャに起因しているとユーザーに思わせる可能性があることです。実際には、一致する実装が見つからなかった定義済みのシンボル(多くの場合、関数)があるということです。
IssuesからCompile Outputウィンドウに変更して上にスクロールすると、どのシンボルが見つからないかを正確に確認できます。鉱山は赤で表示されます。欠落しているシンボルの詳細がIssuesビューに表示されないのは、単に迷惑です。
このエラーを簡単に再現するには、ヘッダーに関数定義を追加し、関数を実装せずに.cppファイルから呼び出します。その後、Issuesウィンドウにこのようなものが表示されます
コンパイル出力ビューに切り替えて上にスクロールすると、次のように表示されます。-
そのため、実際の問題は、PGGuiというクラスの関数DoSomeStuffがコンストラクターPGGui :: PGGuiから呼び出されていることですが、DoSomeStuffの本体はシンボルが見つからないため欠落しています。
幸いなことに、私は答える前に問題を解決できたので、誰かが似たようなことを経験している場合、問題はあなたのように見えることでしたテンプレートクラスを.cppファイルと.hファイルに分割することはできません。 .cpp
ファイルのすべての宣言を.h
に戻すことで問題が解決しました。
ただし、シンボルの重複(分割した理由)の問題がまだ残っていました。今回は、.h
でexternal
として変数を宣言し、1つの(唯一の).cpp
ファイルでexternal
キーワードなしで変数を再宣言すると、良い。
私にとってこの問題は、別のソースファイルとヘッダーを追加した後、メイクファイルを再構築しないために発生しました。
Build:Cleanall-> run qMake-> runの下で
私のためにエラーを修正しました。
私の場合の問題は、多くのサブプロジェクトを持つプロジェクトがあり、サブプロジェクトのプロファイルの1つが空だったことです。
私にとっては、.cppファイルで関数を宣言するときにクラスオブジェクトの名前を書くのを忘れていました。
間違っている:int Zero(int &num)
右:int Common2::Zero(int &num)
Common2はクラスです。