在我的共享库中,由于使用了第三方代码(例如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] 举报,一经查实,本站将立刻删除。