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链接器标志。

4

1 回答 1

2

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

我认为您可以依靠的唯一保证是 myclass.cpp 中的初始化程序将在调用同一 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(),所以保证在他们访问它时会被初始化。

于 2013-08-06T19:08:47.340 回答