0

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

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

我连接我的图书馆名为.dylib对这个.A库。不幸的是,当我的.dylib文件被加载时,没有调用MyClass::newInitialDefaultValue()。 可能是什么原因以及如何处理?

我试过-all_load-force_load连接器标志没有运气。

回答

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(),它保证在访问它时被初始化。

+0

非常感谢您的见解!不幸的是,这个错误发生在构建图书馆的系统中,新版本在不同的位置放置了图书馆的二进制文件,而且我还在使用旧的二进制文件。它发生... – peetonn