我已经阅读了关于这个主题的其他答案,但不幸的是,它们对我没有帮助。我试图将几个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
我只有一个main函数,它在runexp中,形式是
int main(void) {
...;
return 0;
}
有什么想法,为什么我可能会得到这个错误?谢谢!
5条答案
按热度按时间w6mmgewl1#
您应该在
-o
选项后提供输出文件名。在您的情况下,runexp.o
被视为输出文件名,而不是输入对象文件,因此您的main
函数未定义。knsnq2tg2#
编译时没有包括包含
main()
的C文件,因此链接器看不到它。您需要添加它:
e37o9pze3#
您正在通过运行以下命令覆盖目标文件
runexp.o
:实际上,
-o
是用于输出文件的,您需要运行:runexp.out将是二进制文件。
sq1bmfud4#
通常,您可以按以下方式编译大多数.c文件:
gcc foo.c -o foo。它可能会根据您使用的#includes或您是否有任何外部.h文件而有所不同。通常,当您有一个C文件时,它看起来有点像下面这样:
当我得到一个'undefined reference to main',这通常意味着我有一个.c文件,文件中没有
int main()
。如果你是第一次学习java,这是一个可以理解的混淆方式,因为在Java中,你的代码通常看起来如下:我建议看看顶部是否有
int main()
。polhcujo5#
ld个链接器错误:C++中的
undefined reference to
main'`:我知道这个问题是关于C的,但是如果你在这里绊倒了,并且碰巧是用C++编译的(就像我的情况一样),那可能是因为你的
main()
函数在一个命名空间内,把它移到命名空间之外,它就会修复这个错误!例如:
will_not_run.cpp:
如果尝试使用以下命令生成和运行:
...您将得到以下错误:
要解决这个问题,只需删除名称空间,或者将
main()
移出名称空间,它就可以再次正常工作了!因此,如果需要访问
main()
函数内部的my_module
命名空间,只需显式地将其用作my_module::my_func()
或其他名称,或者在您希望访问main()
函数内部命名空间内容的任何作用域中调用using namespace my_module;
。