2

我正在尝试使用 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函数,但显然链接器不想与此有任何关系(这对我来说似乎很奇怪)。

所以我的问题是:如何让链接器不抱怨atexit,而不必包含标准库?

提前致谢!

4

2 回答 2

2

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

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

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

于 2014-03-31T11:55:06.007 回答
0

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

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

于 2014-03-05T23:23:33.367 回答