我正在尝试使用CLang编译和链接一些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
(我省略了输出,包含,定义等等。这些都很好)
我遇到的问题是在链接期间,我收到错误
error: L0039: reference to undefined symbol `atexit'
我已经在这个问题上花了很长时间,但是对于我的生活似乎无法弄清楚如何正确地解决这个问题。
到目前为止,我的研究表明 atexit 是在 stdlib.h 中定义的,但在这种情况下我不能使用标准库(这不是我的决定或者,这个特定项目是完全必需的。)
据我所知,这个问题现在才出现,因为我们现在突然在我们的代码中有静态对象,这是以这种方式编译的,这导致编译器尝试注册con / destructors来执行这些对象,需要调用 __ cxa_atexit (我们已禁用它,因为它也因为相同的原因而提供未定义的引用错误)或 atexit 。
我也尝试在我的代码中定义一个任意的 atexit 函数,但显然链接器不希望与此有任何关系(这对我来说似乎很奇怪)。 / p>
所以我的问题是:如何让链接器不要抱怨 atexit ,而不必包含标准库?
提前感谢一大堆!
答案 0 :(得分:1)
对于未来的访问者,用户damvac能够提供帮助!
以下是我对待解决问题的评论:
似乎我忘了将extern“C”添加到atexit的定义中(我只将其添加到声明中),这似乎解决了这个问题!谢谢所有回复的人,并感谢davmac提供解决方案!
答案 1 :(得分:0)
atexit
(以及“退出”的整个概念)在独立环境中不存在,因此您无法在代码中调用它。
要让编译器不生成调用它的支持代码,您需要使用-ffreestanding
编译所有源文件,以指定您正在使用/生成独立代码。