web-dev-qa-db-ja.com

Cリンクエラー: 'main'への未定義の参照

このトピックに関する他の回答を読みましたが、残念ながら彼らは私を助けませんでした。複数のcプログラムを一緒にリンクしようとしていますが、応答でエラーが発生します。

$ 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

メイン関数は1つだけで、runexpにあります。フォームは

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

このエラーが発生する理由について何か考えはありますか?ありがとう!

24
Nicole

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

23
VHaravy

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

追加する必要があります。

$ gcc -o runexp runexp.c scd.o data_proc.o -lm -fopenmp
6
unwind

オブジェクトファイルを上書きしていますrunexp.oこのコマンドを実行して:

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

実際、-ooutputファイル用です。実行する必要があります:

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

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

2
Bechir

通常、ほとんどの.cファイルは次の方法でコンパイルします。

gcc foo.c -o foo使用する#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()が先頭にあるかどうかを確認することをお勧めします。

0
Jordan Effinger