MinGW GCC -未定义对“atexit”的引用

tpxzln5u  于 2023-05-06  发布在  其他
关注(0)|答案(3)|浏览(259)

我正在尝试将一个大型项目与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提供的正确库。有什么方法可以修复这个错误吗?

njthzxwz

njthzxwz1#

您正在使用-nostdlib进行链接,而atexit()是来自stdlib.h的函数。
根据GCC Link Options:
-nostdlib
链接时不要使用标准系统启动文件或库。没有启动文件,只有您指定的库被传递到链接器,并且指定系统库链接的选项(如-static-libgcc-shared-libgcc)被忽略。

fsi0uk1n

fsi0uk1n2#

库是按照命令行中使用的顺序检查的,因此使用-lgcc -lmsvcrt

vlju58qv

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年才回答:)

相关问题