2013-04-09 29 views
16

このトピックに関する他の回答を読みましたが、残念ながらそれらは私を助けませんでした。私は一緒にいくつかのCプログラムをリンクしようとしています、と私は応答して、エラーを取得しています:Cリンクエラー: 'main'への未定義参照

$ gcc -o runexp.o scd.o data_proc.o -lm -fopenmp 
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o: In function `_start': 
(.text+0x20): undefined reference to `main' 
collect2: ld returned 1 exit status 
make: * [runexp] Error 1 

私は正確に一つの主な機能を持っており、それがrunexpです。形式は

int main(void) { 
    ...; 
    return 0; 
} 

なぜこのエラーが発生する可能性がありますか?ありがとう!

+0

はグローバルスコープでこの機能ですか? –

+4

あなたのGCCコマンドにはrunexp.cは含まれていません、それはrunexp.oに出力されます - あなたはmainメソッドでソースファイルを含んでいますか? –

答えて

18

-oオプションの後に出力ファイル名を指定する必要があります。あなたの場合、runexp.oは出力ファイル名として扱われ、入力オブジェクトファイルではないため、main関数は未定義です。

+1

'-o'オプションを削除し、従来の'。/ a.out'という名前を使用してください。これは美しい名前です;) –

3

コンパイル時にmain()を含むCファイルが含まれていないため、リンカーには表示されません。

は、あなたはそれを追加する必要があります:あなたは、このコマンドを実行して、オブジェクトファイルrunexp.oを上書きしている

$ gcc -o runexp runexp.c scd.o data_proc.o -lm -fopenmp 
1

gcc -o runexp.o scd.o data_proc.o -lm -fopenmp 

実際には、-o出力ファイルです。 あなたは実行する必要があります。

gcc -o runexp.out runexp.o scd.o data_proc.o -lm -fopenmp 

runexp.outはあなたにバイナリファイルになります。

のgcc foo.cの-o fooの:

0

は、一般的には、次の方法の中で最も.cファイルをコンパイルします。使用した#includeや外部の.hファイルがあるかどうかによって異なります。一般的に、あなたがCのファイルを持っている場合、それは多少、次のようになります。私は「メインに未定義の参照」を取得する場合

#include <stdio.h> 
    /* any other includes, prototypes, struct delcarations... */ 
    int main(){ 
    */ code */ 
} 

することは、それは通常私はint main()を持っていません.Cファイルを持っていることを意味しファイル。あなたが最初のJavaを学んだ場合は、これはJavaで以来、混乱の分かり、あなたのコードは、通常、次のようになり、次のとおりです。

//any import statements you have 
public class Foo{ 
    int main(){} 
} 

私はあなたが一番上にint main()を持っているかどうかを調べて助言します。

関連する問題