質問

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が含まれます。これは、リンカが伝えている内容です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top