2011-11-01 6 views
25

が返されました:メインに未定義の参照 - collect2は:ldが私は端末から書くとき、(ES3と呼ばれる)プログラムをコンパイルしようとしましたが、1つの終了ステータス

gcc es3.c -o es3

それがこのメッセージを表示されます。

/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/crt1.o: In function `_start': 
(.text+0x18): undefined reference to `main' 
collect2: ld returned 1 exit status 

私は何ができますか?

+0

このエラーの原因となるコードを投稿するとよいでしょう。 – Lundin

+1

@BrandoSK:私がそのリンクをたどると、私は45秒のカウントダウンを得る。質問の一部としてコードを投稿するか、問題を説明して掲載する小さな例に絞り込んでください。 –

+0

さて、ソースファイルをダウンロードしました。 (1) 'es3.c'ではなく' es3_f3.c'と呼ばれます。 (2)18行目にセミコロンがないなど、複数のエラーがあります。コンパイルできなかった可能性があります。実際のコードを私たちに教えてください。 (ダウンロードされたソースファイルは73行で、これは直接ここに投稿するのに十分です) –

答えて

38

つまり、es3.cにはmain関数が定義されておらず、その中から実行可能ファイルを作成しようとしています。実行可能ファイルにエントリポイントが必要なため、リンカが不満を持ちます。その後、main機能が含まれますファイルmain.cをコンパイルし、リンカがes3.oをマージし、オブジェクトファイルに

gcc es3.c -c 
gcc es3.o main.c -o es3 

上記コンパイルes3.c-cオプションを使用して、オブジェクトファイルのみにコンパイルするに

main.oes3という実行可能ファイルに追加します。

+2

問題は私のプログラムの中に主な機能を入れていることです。/ – bransharp

2

実行ファイルにはmain関数が必要です。 hello worldのデモをご覧ください。

#include <stdio.h> 
int main(void) 
{ 
     printf("Hello world!\n"); 
     return 0; 
} 

ご覧のとおり、主な機能があります。この主な機能を持っていない場合、ldは「メインへの未定義の参照を」

を報告します私の結果を確認します

$ cat es3.c 
#include <stdio.h> 
int main(void) 
{ 
    printf("Hello world!\n"); 
    return 0; 
} 
$ gcc -Wall -g -c es3.c 
$ gcc -Wall -g es3.o -o es3 
~$ ./es3 
Hello world! 

をメインシンボルがあるかどうかを確認するために$ objdump -t es3.oを使用してください。以下は私の結果です。

$ objdump -t es3.o 

es3.o:  file format elf32-i386 

SYMBOL TABLE: 
00000000 l df *ABS* 00000000 es3.c 
00000000 l d .text 00000000 .text 
00000000 l d .data 00000000 .data 
00000000 l d .bss 00000000 .bss 
00000000 l d .debug_abbrev 00000000 .debug_abbrev 
00000000 l d .debug_info 00000000 .debug_info 
00000000 l d .debug_line 00000000 .debug_line 
00000000 l d .rodata  00000000 .rodata 
00000000 l d .debug_frame 00000000 .debug_frame 
00000000 l d .debug_loc  00000000 .debug_loc 
00000000 l d .debug_pubnames  00000000 .debug_pubnames 
00000000 l d .debug_aranges 00000000 .debug_aranges 
00000000 l d .debug_str  00000000 .debug_str 
00000000 l d .note.GNU-stack  00000000 .note.GNU-stack 
00000000 l d .comment  00000000 .comment 
00000000 g  F .text 0000002b main 
00000000   *UND* 00000000 puts 
+0

あなたの答えに感謝しますが、私は私のプログラムの中に主な機能を持っています:( コンパイラがそれを読んでいない理由を理解していない:( – bransharp

+0

私は私のlinux、それを確認してください。 – Daniel

+1

私はあなたが本当にメインを持っていないと信じています;それは隠されている、プリプロセッサによってスキップされた内部または静的...あなたのファイルを 'インデント'しようとすると、 –

10

おそらく、mainの機能がコメントアウトされました。前処理。 どのような前処理が行われているかを知るには、gcc -C -E es3.c > es3.iを試して、生成されたファイルes3.i(そしてその中のmainを検索)にエディタを見てください。

まず、あなたは常に(あなたが初心者なので)-Wallフラグが非常に重要であり、あなたは常にそれを使用する必要があります

gcc -Wall -g -c es3.c 
    gcc -Wall -g es3.o -o es3 

でコンパイルする必要があります。これはコンパイラに(ほぼ)すべての警告を与えるよう指示します。そして、あなたはもはや警告を聞く必要があります。つまり、警告がなくなるまで、あなたのソースコードファイルes3.Cを修正してください。

gccにオブジェクトファイルと実行可能ファイルにデバッグ情報を書き込むように指示するので、-gフラグも重要です。次に、デバッガ(gdbなど)を使用してプログラムをデバッグすることができます。

オブジェクトファイルまたは実行可能ファイル内のシンボルのリストを取得するには、nmを使用できます。

もちろん、私はあなたがGNU/Linuxシステムを使用していると仮定しています(まだ使用していない場合はGNU/Linuxを使用してください)。

+0

はい私はUbuntuを使用しています!私は行って、感謝の言葉を試してみよう! – bransharp

0

これまでに言及されていない可能性の1つは、自分が思っているファイルを編集していない可能性があるということです。つまり、あなたのエディタはあなたが考えていたものとは異なる意見を持っているかもしれません。

あなたが実際に望む内容を持っているかを再確認するために、コンパイルしているファイルの 'more'を実行してください。希望が助けてくれる!

0

main関数を追加するだけでこの問題を解決できます。 ちょうどのように:

int main() 
{ 
    return 0; 
} 
関連する問題