GCC中的__attribute __((init_priority(X)))

Mir*_*pas 6 c++ static gcc initialization

__attribute__((init_priority(X)))在GCC中使用这样的:

Type1 __attribute__ ((init_priority (101))) name1 = value1;
Type2 __attribute__ ((init_priority (102))) name2 = value2;
Run Code Online (Sandbox Code Playgroud)

在不同的源文件中.我们说file1.cpp和file2.cpp.如果我在同一个库中使用它,它按预期工作,name1在name2之前初始化,但如果我在不同的库中使用它,初始化的顺序不是预期的.我在gcc文档中读到,这应该像我期望的那样在不同的库中工作,以定义初始化的顺序.我使用它的方式有什么问题吗?你有同样的问题吗?

PS:重构不是这个问题的解决方案,因为我必须从Visual Studio移植一个非常大的项目.

Ant*_*ams 8

gcc文档(gcc 4.4)说:

`init_priority(PRIORITY)'

在标准C++中,保证在命名空间范围内定义的对象按照严格按照给定转换单元中的定义的顺序进行初始化.不保证翻译单元的初始化.但是,GNU C++允许用户使用`init_priority'属性控制在命名空间范围内定义的对象的初始化顺序,方法是指定相对PRIORITY,一个当前限制在101和65535之间的常量整数表达式.数字越小表示优先级越高.

没有任何迹象表明它如何适用于库,尤其是共享库.我希望静态库(libxyz.a)在这方面与单个目标文件的工作方式相同,因为它们只是目标文件的集合,文档的措辞表明它适用于翻译单元(即具有不同的对象)文件).

但是,共享库本身就是有效的可执行文件 - 在给定的共享库中,初始化按指定的顺序完成,但共享库按动态加载器指定的顺序初始化,即liba.so被加载在libb.so之前或之后,基于加载器的排序条件,init_priority属性不会影响该排序.