Linux共享库的init和deinit也使用c ++静态初始化

我想要自动调用来初始化和取消初始化我的共享库

在我的共享库中,由于使用了第三方代码(例如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

但提供的解决scheme不适合我的需求。 在这两种方法( __attribute__((constructor))甚至-Wl,-init,<function name> )中,init函数似乎在C ++对象的静态初始化完成之前被调用。

我也玩过__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)) )sorting略有不同的行为)。

有什么build议么?

我目前的解决方法是提供必须由应用程序手动调用的导出函数(lib_init()和lib_deinit())。

这是一个可能的解决方案。

TU中的静态对象按其定义的顺序进行初始化。 将特殊类型T的静态对象的定义追加到每个源文件的末尾。 T的构造函数应该增加一个静态的零初始化成员。 只要计数器达到模块中的源文件数量(由构建脚本确定),就调用你的lib_init()

计数器递减到零后调用lib_deinit()

每个图书馆应该有自己的T

你应该可以修改你的makefile文件,这样你就不必修改源文件。 例如,而不是g++ -c foo.C使用g++ -c myspecialstaticinitcode.C -o foo.C -include foo.C或类似的东西。