シンボルの重複に関する奇妙なldエラー
-
08-07-2019 - |
質問
main.cとlogoff.cの2つのファイルで構成されるプロジェクトがあります。コンパイルしようとすると、次のエラーが表示されます。
gcc -c -g -Wall main.c
gcc -c -g -Wall logoff.c
gcc -o main -g -Wall main.o logoff.o
ld: duplicate symbol _logoff in logoff.o and main.o
logoff.cにはlogoffという名前の関数がありますが、main.cで「quotoff」というテキストを検索しました。そして何も見つかりませんでした(関数はまだ呼び出されていません!)。
関数の名前をlog_offに変更すると、機能します。ファイルに2番目の関数があり、名前も変更しない限り同じエラーが発生します。
これが発生する理由はありますか?この問題は2つの異なるシステムで発生します。関連する可能性のあることの1つは、別のプロジェクトで同じlogoff.cファイルを使用したことですが、このファイルには接続されていません。
解決
次のように、logoffの関数宣言のみでlogoff.hファイルを作成します
void logoff(void);
次に、main.cに #include" logoff.h"
でインクルードします。 logoff.cを含めないでください。コンパイラが関数を2回コンパイルし、リンカーはその名前の2つの関数を見ることになります。
log_offに変更し、そのうちの1つだけを再コンパイルすると機能するようです。他のオブジェクトファイルには、古いログオフ関数がコンパイルされたままです。したがって、リンカは1つのlog_offと1つのログオフを認識します。それがその名前であなたのために働くように見えた理由です。
他のヒント
main.cに#includeまたは#import logoff.cを追加しますか?
やった-まああなたの問題があります。 logoff.cはmain.cに含まれているため、mainは_logoffと_mainを定義します。ここで、_logoffを定義するlogoff.cもコンパイルします。次に、2つをリンクしようとします。つまり、結果のバイナリには、シンボル_main、_logoff、および_logoffが含まれます。これは、リンカが伝えている内容です。