如何防止优化掉的启动代码的链接?(How to prevent the linker from op

2019-07-01 17:25发布

我有以下问题:我的(C ++ - )项目由多个子项目的。 在每一个,我有几个代码文件,我想在启动时运行。 我的解决方法到目前为止是使用调用相应的代码在初始化这样的静态变量:

// Foo.cpp

static TFooRegistry sFooRegistry;   // does stuff in constructor.

当使用的DLL各子项目建设我的项目,一切工作正常,代码运行正常。 当静态链接的子项目,但是,链接确定foo.o将不包含任何代码从外部曾经引用并优化它拿走。 当然,我可以添加一个引用sFooRegistry别的地方,但这是乏味和容易出错。

解决这个什么(标准符合性)的方式有哪几种?

OK,我能做些什么在Mac / gcc和赢得/视觉工作室?

Answer 1:

有要初始化迫使库的对象没有标准的符合性的方式 - 你必须使用技巧根据您的特定平台(一个或多个)上。 一个DLL和与静态库之间的差异(在Windows,至少)是前者的启动和由操作系统执行关机代码,而后者仅仅是一个目标文件的串联。

此外,连接器不优化掉你的启动时的代码 - 它根本就不是链接它,因为它显然是从来没有使用过。 接头是非常愚蠢的野兽-如果你想了解他们如何做他们做什么,看看书链接器和装载机 。



Answer 2:

一些伎俩,但审查。 对于WIN系统(而不是Linux)使用显式DLLEXPORT - 在这种情况下连接doen't如果使用外部应用程序或没有这个符号知道。



文章来源: How to prevent the linker from optimizing away startup code?