1

我有一个使用我制作的静态库的应用程序。库中的一个 .cpp 文件有一个静态变量声明,其 ctor 在一个单例上调用一个函数,该函数执行某些操作——例如添加一个字符串。

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

我肯定错过了一些东西,但我不知道是什么..

4

3 回答 3

5

如果您在应用程序中未明确使用的静态库中有一个对象。然后链接器不会将该对象从库中拉到应用程序中。

静态库和动态库有很大的不同。

动态库:
在编译时,不会从动态库中提取任何内容。添加了额外的代码以在运行时显式加载和解析符号。在运行时加载整个库,因此调用对象初始化器(尽管何时是实现细节)。

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

于 2009-12-13T19:10:28.003 回答
1

我对此的记忆有点模糊,但您可能会遇到初始化顺序问题。无法保证调用不同文件中的静态变量初始化程序的顺序,因此,如果在初始化库中的静态变量时尚未初始化单例,则可能会产生您所看到的效果。

我解决这些问题的方法是使用某种显式init函数来执行此操作,并且我会在开始时调用main它。您可能可以摆弄将目标文件和库参数提供给编译器(实际上是链接器)的顺序,因为这也适用于我,但该解决方案有点脆弱,因为它不仅取决于使用特定的链接器,但也可能是特定的版本。

于 2009-12-13T18:00:34.383 回答
0

重构进行静态初始化的类,使它们不依赖于任何其他此类。也就是让每个类的初始化独立且自给自足。

于 2009-12-13T18:55:10.443 回答