我正在将应用程序从Solaris移植到Linux
被链接的目标文件没有定义main()。但是编译和链接在Solaris中正确完成,并且生成可执行文件。在Linux中,我得到这个错误
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
字符串
我的问题是,我不能包括新的.c/.o文件,因为它是一个巨大的应用程序,并已运行多年.我如何才能摆脱这个错误?
makefile的代码摘录:
RPCAPPN = api
LINK = cc
$(RPCAPPN)_server: $(RPCAPIOBJ)
$(LINK) -g $(RPCAPIOBJ) -o $(RPCAPPN)_server $(IDALIBS) $(LIBS) $(ORALIBS) $(COMMONLIB) $(LIBAPI) $(CCLIB) $(THREADLIB) $(DBSERVERLIB) $(ENCLIB)
型
9条答案
按热度按时间sauutmhj1#
尝试将
-nostartfiles
添加到链接器选项中,即字符串
关于gcc documentation:
型
这会导致
crt1.o
不被链接(默认情况下它通常是链接的)-通常只在您实现自己的_start
代码时使用。mbyulnm02#
编译
.so
时必须使用-shared
链接选项zf9nrax13#
对我来说,问题是,我错误地把
int main()
放在一个命名空间中。确保不要这样做,否则你会得到这个恼人的链接错误。希望这对任何人都有帮助:)
f1tvaqid4#
当我尝试使用boost构建一个新的测试项目时,也有类似的结果,结果发现我缺少了一个声明:
字符串
t8e9dugd5#
在编译一个链接了C++组件的Fortran程序时,我得到了类似的结果。在我的例子中,CMake未能检测到Fortran应用于最终链接。
make
返回的消息以字符串
解决方案是添加
型
到CMakeLists.txt,这样
make
就可以打印出来:型
xytpbqjk6#
我在创建c项目时也遇到了同样的问题,我忘记了保存我的main. c文件,所以没有main函数。
xmq68pz97#
我在一个大型的
CMake
项目中遇到了同样的问题,在我将一些函数从一个代码文件移到另一个代码文件后,我删除了构建文件夹,重新创建并重建它。然后它工作了。一般来说,对于突然出现的链接器错误,请尝试完全删除您的构建文件夹并首先重建。这可以保存您从尝试查找实际上根本不应该存在的错误中所遇到的头痛:可能有
CMake
缓存变量浮动,这些变量具有错误的值,或者某些内容被重命名但未删除,.3ks5zfa08#
我也遇到了同样的问题,但在FreeBSD 13.1上。
解决这个问题的方法是简单地添加:
字符串
由于
.cpp
文件只是一个包含定义和声明的对象文件,因此使用:型
每次我试着编译这个,编译器总是抛出与OP相同的错误。
所以我所做的就是在底部添加一个空的
main()
函数,然后编译代码,没有错误。llmtgqce9#
我也有
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o: in function _start': (.text+0x17): undefined reference to main'
,因为我的C++实现文件没有main()。