微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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 ++对象的静态初始化完成之前被调用

不同的进程是否有单独的共享静态variables或普通副本的副本?

现代Linux发行版中共享库真正保存了多less磁盘空间?

有人可以解释有关Linux库命名?

如何find依赖库

mprotect返回ENOMEM在solib中的地址空间,任何解决方法

我也玩过__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())。

我怎样才能共享两个程序之间的图书馆c

我怎么知道我的.so库的脚印?

C ++符号在共享对象中具有不同的大小

在Linux上将共享库与未parsing的符号链接起来

在Windows中编译.so

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐