动态库中共享库的静态初始值设定项

Static initializer of shared library inside dynamic library

本文关键字:静态 共享 动态      更新时间:2023-10-16

所以我有一个静态库(MacOS,.a库)。它是用C++编写的,代码中有静态初始化程序,如下所示:

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

我正在将我的.dlib库与这个.alib链接起来。不幸的是,当加载.dlib文件时,不会调用任何MyClass::newInitialDefaultValue()。原因是什么?如何处理?

我尝试过-all_load-force_load链接器标志,但没有成功。

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

我认为您可以指望的唯一保证是,在调用同一cpp文件中的任何其他代码之前,将调用myclass.cpp中的初始值设定项。您需要通过函数公开对默认值的访问权限。这将类似于辛格尔顿模式。例如:

//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(),因此保证在访问时对其进行初始化。