动态库中共享库的静态初始值设定项
Static initializer of shared library inside dynamic library
所以我有一个静态库(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(),因此保证在访问时对其进行初始化。
相关文章:
- 将静态库链接到不带-fPIC的共享库中
- C++两个源文件之间共享的枚举的静态实例
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- Android NDK:用于第三方Java库的静态或共享C++运行时
- 仅在少数方法(静态或共享库)中解析的外部符号
- c++ 是否保证标头初始化的静态 const 成员跨编译单元和库共享单个实例?
- 函数范围的静态变量如何导致与共享库中函数代码的未来使用不兼容
- 如何在共享库中保留静态库中的自由函数
- Cmake 查找模块用于区分共享库或静态库
- 指向静态常量对象的共享指针?
- 从静态库构建共享库
- 如何从静态c和c++库创建共享c库
- 将共享对象与静态库链接
- 共享库中静态功能成员的破坏顺序
- 使用 MapViewOfFile 分配静态共享内存
- 为多个类实例维护共享_ptr的静态列表
- 使用C 中的共享_ptr从公共静态成员函数访问私有构造函数
- Cython:无法调用共享库的非静态方法
- 两个C++库如何共享一个静态缓冲区?
- 在使用自动工具构建静态/共享库时,如何避免双重编译