我正在尝试将一个大型项目与MinGW的GCC 4.8.1连接起来,用于x86目标。我这样调用链接器
D:\MyGCCPath\gcc -L [LIBPATHS] -nostdlib -Wl,-Map,D:\PathToMapFile.map,--emit-relocs [OBJECTFILES AND LIBS] -lmsvcrt -lgcc -o D:\PathToMyOutputFile
通过这个调用,我得到了这个链接器错误:
libgcc.a(__main.o):(.text+0x5a): undefined reference to `atexit'
我尝试了不同的msvcr
版本(100和90),但这更多的是一种绝望的尝试,因为我不是很熟悉这个问题。我正在使用MinGW提供的正确库。有什么方法可以修复这个错误吗?
3条答案
按热度按时间njthzxwz1#
您正在使用
-nostdlib
进行链接,而atexit()
是来自stdlib.h
的函数。根据GCC Link Options:
-nostdlib
链接时不要使用标准系统启动文件或库。没有启动文件,只有您指定的库被传递到链接器,并且指定系统库链接的选项(如
-static-libgcc
或-shared-libgcc
)被忽略。fsi0uk1n2#
库是按照命令行中使用的顺序检查的,因此使用
-lgcc -lmsvcrt
。vlju58qv3#
你和于浩评论链里的推理完全正确。
您需要使用
-lmsvcr100
导入libmsvcr100.a
以获得atexit
符号。(其他地方也可能有)。其他进口,你可能会需要,如果你会(明智!)喜欢避免
-nostdlib
生成的隐式导入的不可理解性:lgcc
lgcc_eh
lmsvcr100
lmingw32
lmingwex
您可能还需要其中的一些,这取决于您引用的符号,但这是基于对
clang/lib/Driver/ToolChains
中字符串OPT_nostdlib
的源代码的简单的猜测:lmingwthrd
lssp
lssp_nonshared
lomp
liomp5md
lgomp
lmoldname
lgcc_s
lmsvcr110
lmsvcr120
lmsvcr120_app
lmsvcr120d
lmsvcr80
lmsvcr90
lmsvcr90d
lmsvcrt-os
我花了10年才回答:)