このトピックに関する他の回答を読みましたが、残念ながら彼らは私を助けませんでした。複数の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;
}
このエラーが発生する理由について何か考えはありますか?ありがとう!
-o
オプションの後に出力ファイル名を指定する必要があります。あなたの場合、runexp.o
は入力オブジェクトファイルではなく出力ファイル名として扱われます。したがって、main
関数は未定義です。
コンパイル時にmain()
を含むCファイルを含めていないため、リンカーには表示されません。
追加する必要があります。
$ gcc -o runexp runexp.c scd.o data_proc.o -lm -fopenmp
オブジェクトファイルを上書きしていますrunexp.o
このコマンドを実行して:
gcc -o runexp.o scd.o data_proc.o -lm -fopenmp
実際、-o
はoutputファイル用です。実行する必要があります:
gcc -o runexp.out runexp.o scd.o data_proc.o -lm -fopenmp
runexp.outはバイナリファイルになります。
通常、ほとんどの.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()
が先頭にあるかどうかを確認することをお勧めします。