1

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 で「logoff」というテキストを検索しましたが、何も見つかりませんでした (関数はまだ呼び出されていません!)。

関数の名前を log_off に変更すると機能します。ファイルには 2 番目の関数があり、その名前も変更しない限り、同じエラーが発生します。

これが発生する理由はありますか?2 つの異なるシステムでこの問題が発生しています。関連する可能性のあることの 1 つは、別のプロジェクトで同じ logoff.c ファイルを使用したが、このファイルに接続されていないことです。

4

2 に答える 2

2

main.c に logoff.c を #include または #import しますか?

あなたはそうしました-まあ、あなたの問題があります。logoff.c は main.c に含まれているため、main は _logoff と _main を定義します。ここで、_logoff を定義する logoff.c もコンパイルします。次に、この 2 つをリンクしてみます。つまり、結果のバイナリには、リンカーが伝えているシンボル _main、_logoff、および _logoff が含まれます。

于 2008-11-17T22:19:36.093 に答える
2

次のように、logoff の関数宣言のみを含む logoff.h ファイルを作成します。

void logoff(void);

次に、main.c に でインクルードし#include "logoff.h"ます。コンパイラは関数を 2 回コンパイルし、リンカはその名前の 2 つの関数を参照するため、logoff.c を含めないでください。

log_off に変更してから、そのうちの 1 つだけを再コンパイルすると、機能するように見えます。もう一方のオブジェクト ファイルには、古いログオフ関数がコンパイルされたままです。したがって、リンカは 1 つの log_off と 1 つの logoff を認識します。それが、その名前であなたのために働くように見えた理由です。

于 2008-11-17T22:23:38.457 に答える