atexit()undefined与独立的CLang

时间:2014-03-05 16:12:28

标签: c++ gcc linker clang atexit

我正在尝试使用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 ,而不必包含标准库?

提前感谢一大堆!

2 个答案:

答案 0 :(得分:1)

对于未来的访问者,用户damvac能够提供帮助!

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

  

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

答案 1 :(得分:0)

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

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