动态库内共享库的静态初始化程序

时间:2013-08-06 18:32:31

标签: c++ static-libraries dynamic-library static-initialization

所以我有一个静态库(MacOS,.a库)。它是用C ++编写的,并且在代码中有静态初始化器:

//myclass.hpp
class MyClass {
    ...
    static MyClass *defaultValue_;
    static MyClass *newInitialDefaultValue();
    ...
}
...
//myclass.cpp
MyClass *MyClass::defaultValue_ = newInitialDefaultValue();
...

我正在将.dylib库链接到这个.a lib。不幸的是,当加载我的.dylib文件时,不会调用MyClass::newInitialDefaultValue()。 可能是什么原因以及如何处理这个问题?

我尝试了-all_load-force_load链接器标记但没有运气。

1 个答案:

答案 0 :(得分:1)

all_load和force_load链接器标志仅确保代码链接到二进制文件。我认为这些旗帜不会对你有帮助。

我认为你能指望的唯一保证是,在调用同一个cpp文件中的任何其他代码之前,将调用myclass.cpp中的初始化程序。您需要通过函数公开对默认值的访问。这与Singleton模式类似。例如:

//myclass.hpp
class MyClass {
    ...
    static MyClass *getDefaultValue();
    ...
}
...
//myclass.cpp
static MyClass* defaultValue_; // Note that this is not a member variable
MyClass* MyClass::getDefaultValue() {
   if (defaultValue_ == nullptr) {
       defaultValue_ = newInitialDefaultValue(); 
   }
   return defaultValue_;
}   
...

注意:我没有尝试使这个线程安全或处理错误。

现在,加载库时,defaultValue_仍然不会自动初始化。但由于唯一的访问调用者是通过getDefaultValue(),因此可以保证在访问它时进行初始化。