例:
struct Foo { Foo() { printf("foo\n"); } };
static Foo foo;
__attribute__((constructor)) static void _bar() { printf("bar\n"); }
Run Code Online (Sandbox Code Playgroud)
它是确定性的foo还是bar首先印刷的?
(我希望并且期望静态对象的构造函数总是先执行但不确定,并且GCC关于构造函数属性的文档没有说明任何内容.)
我想要自动调用来初始化和取消初始化我的共享库.
在我的共享库中,我需要对C++对象进行一些静态初始化,其中包括使用第三方代码(例如UnitTest ++).当执行我的init函数时,我需要保证,C++对象(所有链接的翻译单元)的所有静态初始化都已完成(反之亦然); 因此,与main()的执行在C++程序中可以预期的条件相同.
我已经看到很多关于linux共享库init/deinit的信息,例如:
__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)));
Run Code Online (Sandbox Code Playgroud)
但是,这也不会将呼叫置于期望的位置; 即使有__attribute__((constructor(65535))).
我用gcc 4.6.4,4.7.3和4.8.1进行了测试(4.6.4显示了关于排序的略微不同的行为__attribute__((constructor))).
有什么建议?
我目前的解决方法是提供必须由应用程序手动调用的导出函数(lib_init()和lib_deinit()).