如何防止链接器优化启动代码?

Tob*_*ias 3 c++ linker static-initialization

我有以下问题:我的(C++-)项目由多个子项目组成。在每个文件中,我都有几个文件,其中包含我想要在启动时运行的代码。到目前为止,我的解决方案是使用静态变量,它们在初始化时调用相应的代码,如下所示:

// Foo.cpp

static TFooRegistry sFooRegistry;   // does stuff in constructor.
Run Code Online (Sandbox Code Playgroud)

当为每个子项目使用 dll 构建我的项目时,一切正常并且代码按预期运行。然而,当静态链接子项目时,链接器确定 Foo.o 不包含从外部引用的代码,并将其优化掉。当然,我可以在其他地方添加对 sFooRegistry 的引用,但这很乏味且容易出错。

有哪些(符合标准的)方法可以解决这个问题?

好的,我可以在 mac/gcc 和 win/visual studio 上做什么?

小智 5

没有标准的一致方法可以强制初始化库中的对象 - 您必须根据您的特定平台使用技巧。DLL 和静态库(至少在 Windows 上)之间的区别在于,前者具有由操作系统执行的启动和关闭代码,而后者只是目标文件的串联。

另外,链接器并没有优化您的启动代码 - 它只是没有链接它,因为它显然从未被使用过。链接器是非常愚蠢的野兽 - 如果您想了解它们是如何做它们所做的事情,请看一下《链接器和加载器》一书。