42

我已经阅读了关于这个主题的其他答案,不幸的是他们没有帮助我。我试图将几个 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

我只有一个主要功能,它在 runexp 中。形式是

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

关于为什么我可能会收到此错误的任何想法?谢谢!

4

4 回答 4

35

您应该在选项后提供输出文件名-o。在您的情况下runexp.o,被视为输出文件名,而不是输入目标文件,因此您的main函数未定义。

于 2013-04-09T14:51:58.353 回答
10

您不包括main()编译时包含的 C 文件,因此链接器看不到它。

您需要添加它:

$ gcc -o runexp runexp.c scd.o data_proc.o -lm -fopenmp
于 2013-04-09T14:52:45.323 回答
4

您正在runexp.o通过运行以下命令覆盖您的目标文件:

 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将是你的二进制文件。

于 2013-04-09T14:57:26.023 回答
0

通常,您通过以下方式编译大多数 .c 文件:

gcc foo.c -o foo. 它可能会有所不同,具体取决于您使用的#includes 或您是否有任何外部 .h 文件。一般来说,当你有一个 C 文件时,它看起来有点像下面这样:

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

当我得到“对 main 的未定义引用”时,通常意味着我有一个文件中没有的 .cint main()文件。如果您第一次学习 java,这是一种可以理解的混淆方式,因为在 Java 中,您的代码通常如下所示:

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

我建议看看你是否int main()在顶部。

于 2017-02-01T02:12:51.140 回答