atexit()未定义,带有独立的叮当声 我试图用CLAN编译和链接一些C++代码,下面的命令行: clang.exe -nostdinc -MD -fno-use-cxa-atexit -fno-rtti -fno-exceptions -fsigned-char -fno-stack-protector -fPIC -m64 -Wall -Werror -Wno-unused-function -Wno-unused-label -Wno-ignored-attributes

atexit()未定义,带有独立的叮当声 我试图用CLAN编译和链接一些C++代码,下面的命令行: clang.exe -nostdinc -MD -fno-use-cxa-atexit -fno-rtti -fno-exceptions -fsigned-char -fno-stack-protector -fPIC -m64 -Wall -Werror -Wno-unused-function -Wno-unused-label -Wno-ignored-attributes,c++,gcc,linker,clang,atexit,C++,Gcc,Linker,Clang,Atexit,(我省略了输出、包含、定义等。这些都很好) 我遇到的问题是,在链接过程中,我得到了错误 error: L0039: reference to undefined symbol `atexit' 我已经在这个问题上花了相当长的时间,但我似乎一辈子都不知道如何正确地解决这个问题 到目前为止,我的研究表明,atexit是在stdlib.h中定义的,但我不能在这种情况下使用标准库(这也不是我的决定,对于这个特定项目来说是完全强制性的) 据我所知,这个问题只是现在才出现,因为我们现在的代码中突然有了静态

(我省略了输出、包含、定义等。这些都很好)

我遇到的问题是,在链接过程中,我得到了错误

error: L0039: reference to undefined symbol `atexit'
我已经在这个问题上花了相当长的时间,但我似乎一辈子都不知道如何正确地解决这个问题

到目前为止,我的研究表明,atexit是在stdlib.h中定义的,但我不能在这种情况下使用标准库(这也不是我的决定,对于这个特定项目来说是完全强制性的)

据我所知,这个问题只是现在才出现,因为我们现在的代码中突然有了静态对象,而这些对象是以这种方式编译的,这导致编译器试图注册con/析构函数来执行这些对象,这需要调用\uucxa\u atexit(我们禁用了它,因为它也因为同样的原因给出了未定义的引用错误)或atexit


我还尝试在代码中定义任意的atexit函数,但显然链接器不想与此有任何关系(这对我来说似乎很奇怪)

所以我的问题是:如何让链接器在不包含标准库的情况下不抱怨atexit

提前感谢大家!

atexit
(以及“退出”的整个概念)不存在于独立的环境中,因此您不能在代码中调用它

要使编译器不生成调用它的支持代码,您需要使用
-ffreestanding
编译所有源文件,以指定您正在使用/生成独立代码。

对于未来的访问者,用户可以提供帮助

以下是我对正在解决的问题的评论:

似乎我忘了在atexit的定义中添加extern“C”(我只是在声明中添加了它),这似乎解决了问题!感谢所有回复的人,感谢davmac提供解决方案


“我还尝试在代码中定义任意atexit函数,但显然链接器不想与此有任何关系(这对我来说确实很奇怪)。”-也许您忘记将其声明为'extern“C”“嗯,我相信这是我第一次尝试,但我不是100%确定。我回到办公室后会尝试一下!(希望这能解决问题)同时,我欢迎任何人提出的任何和所有其他建议,顺便说一句,我的选择越多越好。似乎我忘了添加外部“C”atexit的定义(我只是将其添加到声明中),这似乎解决了问题!感谢所有回复的人,感谢davmac提供解决方案!我相信问题是g++生成了对
atexit
的调用,而不是OP调用了
atexit
;此外,我认为使用
-ffreestanding
不会有帮助,因为编译器仍然必须注册以某种方式销毁静态初始化变量。davmac,你是对的。我们的代码本身并没有调用atexit,而是编译器插入这些调用来销毁静态对象(但我认为Chris Dodd也理解这一点)。我确实尝试过使用-ffreestanding,但似乎无法解决问题。