3

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

// Foo.cpp

static TFooRegistry sFooRegistry;   // does stuff in constructor.

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

有什么(符合标准的)解决这个问题的方法?

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

4

2 回答 2

4

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

此外,链接器并没有优化您的启动代码 - 它只是没有链接它,因为它显然从未使用过。链接器是相当愚蠢的野兽——如果你想了解它们是如何做的,请看一下Linkers & Loaders一书。

于 2009-08-19T15:40:08.237 回答
1

一些技巧,但回顾一下。对于 Win 系统(但不是 linux),使用显式 dllexport - 在这种情况下,链接器不知道外部应用程序是否使用了这个符号。

于 2009-08-19T15:44:45.997 回答