我想要自动调用来初始化和取消初始化我的共享库。
在我的共享库中,由于使用了第三方代码(例如 UnitTest++),我需要对 C++ 对象进行一些静态初始化。当我的 init 函数执行时,我需要保证 C++ 对象(所有链接的翻译单元)的所有静态初始化都已完成(反之亦然 deinit);因此,与在 C++ 程序中执行 main() 的条件相同。
我已经看到了很多关于 linux 共享库 init/deinit 的信息,例如:
- 加载共享库时自动执行的函数
- 如何在 Linux 上初始化共享库
- http://www.faqs.org/docs/Linux-HOWTO/Program-Library-HOWTO.html#INIT-AND-CLEANUP
__attribute__((constructor))
甚至-Wl,-init,<function name>
)中,似乎在 C++ 对象的静态初始化完全完成之前调用了 init 函数。
我也玩过类似的__attribute__ ((init_priority(…)))
东西:
class InitAndDeinit {
public:
InitAndDeinit() {
// Do some initialization
}
~InitAndDeinit() {
// Do some cleanup
}
} initAndDeinit __attribute__((init_priority(65535)));
但这也不会将呼叫置于所需的位置;即使有__attribute__((constructor(65535)))
.
我用 gcc 4.6.4、4.7.3 和 4.8.1 进行了测试(4.6.4 对 的排序表现出稍微不同的行为__attribute__((constructor))
)。
有什么建议么?
我当前的解决方法是提供必须由应用程序手动调用的导出函数(lib_init() 和 lib_deinit())。