我有一个使用我制作的静态库的应用程序。库中的一个.cpp文件有一个静态变量声明,它的ctor在一个单例上调用一个函数来执行某些操作 - 例如添加一个字符串。
现在,当我从应用程序中使用该库时,我的单例似乎不包含应该添加的字符串的任何痕迹。
我肯定错过了一些东西,但我不知道是什么......
答案 0 :(得分:5)
如果静态库中的对象在应用程序中不是 EXPLICITLY 。然后链接器不会将该对象从lib拉入应用程序。
静态库和动态库之间存在很大差异。
动态图书馆:
在编译时,动态库中没有任何内容。添加额外代码以在运行时显式加载和解析符号。在运行时,加载整个库,从而调用对象初始值设定项(尽管实现细节时)。
静态库的处理方式非常不同:
当您链接到静态库时,它会将库中定义的应用程序中未定义的所有项目提取到应用程序中。重复此过程,直到库不再有可解析的依赖项为止。这样做的副作用是未明确使用的对象/函数不会从库中拉出(因此不会拉取未直接访问的全局变量)。
答案 1 :(得分:1)
我对此的记忆有些模糊,但您可能会遇到初始化顺序问题。无法保证调用不同文件中的静态变量初始化程序的顺序,因此如果在初始化库中的静态变量时尚未初始化单例,则可能会产生您所看到的效果。
我解决这些问题的方法是使用某种明确的init
函数来完成这些工作,并在main
或其他东西开始调用。您可能能够将编译器(或实际上是链接器)提供给目标文件和库参数的顺序摆弄,因为这对我来说也很有用,但是这个解决方案有点脆弱,因为它不仅取决于使用特定链接器,但也可能是特定版本。
答案 2 :(得分:0)
重构执行静态初始化的类,这样它们就不依赖于任何其他类。也就是说,使每个类的初始化独立且自给自足。