2009-12-13 48 views
1

我有一个应用程序正在使用我制作的静态库。库中的一个.cpp文件有一个静态变量声明,它的ctor在一个单独的函数上调用一个函数,添加一个字符串。静态变量初始化代码永远不会被调用

现在,当我从应用程序使用该库时,我的单例似乎没有包含应该添加的字符串的任何痕迹。

我确实失去了一些东西,但我不知道是什么..

回答

5

如果你不是明确标明应用程序中使用静态库有一个对象。然后链接程序不会将该对象从lib中拖到应用程序中。

静态和动态库之间存在很大差异。

动态库:
在编译时,动态库中没有任何东西被拉出。添加额外的代码以在运行时显式加载和解析符号。在运行时,整个库被加载,因此调用对象初始化器(虽然何时是实现细节)。

静态库的处理方式非常不同:
当您针对静态库进行链接时,它会将应用程序中未定义的所有项目库中定义的项目拖到应用程序中。重复这个操作,直到库没有更多的依赖可以解决。这样做的副作用是未明确使用的对象/函数不会从库中拉出(因此不会直接访问全局变量)。

+0

你钉了它,谢谢。确实没有明确使用它,但我*认为*它将保持代码在调试模式下。 – 2009-12-13 19:14:24

1

我的这种记忆是有点朦胧,但你可能有一个初始化顺序问题被击中。无法保证不同文件中的静态变量初始值设定项被调用的顺序,所以如果你的单例没有被初始化,当你的库中的静态变量被初始化时,这可能会产生你所看到的效果。

我得到解决这些问题的方法是有某种明确的init函数来做这些事情,我在main开头打电话什么的。你也许能够摆脱把对象文件和库参数赋给编译器(或者实际上是连接器)的顺序,因为这对我也有效,但是这个解决方案有点脆弱,因为它不仅取决于使用特定的链接器,但也可能是特定的版本。

+0

感谢您的快速回答。这绝对不是订单问题,因为我已经对此进行了整理。 init不方便,因为我想在任意数量的cpp文件中声明任意数量的这种变量,并且在运行时处理* generated *列表。 – 2009-12-13 18:55:48

0

重构静态初始化的类,以便它们不依赖于任何其他类。也就是说,让每个类的初始化都是独立自足的。

+0

关键是,静态变量只存在(在它们的ctor中)一个静态函数 - 在一个cpp文件中定义 - 列表中,以便我可以在运行时稍后选择其中一个。所以在这种情况下,没有独立的概念 - 我想。 – 2009-12-13 19:03:37