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

时间:2009-08-19 15:35:56

标签: c++ linker static-initialization

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

// Foo.cpp

static TFooRegistry sFooRegistry;   // does stuff in constructor.

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

有什么(符合标准的)解决方法?

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

2 个答案:

答案 0 :(得分:4)

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

此外,链接器并没有优化你的启动代码 - 它根本就没有链接它,因为它显然从未使用过。链接器 是非常愚蠢的野兽 - 如果你想知道他们如何做他们做的事情,看一看 在书Linkers & Loaders

答案 1 :(得分:1)

有些技巧,但请仔细阅读。 对于Win系统(但不是linux)使用显式dllexport - 在这种情况下,链接器不知道外部应用程序是否使用此符号。