#在linux上使用gcc编译器的pragma init和#pragma fini
我想构建一些代码,在加载共享库时调用一些代码。我想我会这样做:#在linux上使用gcc编译器的pragma init和#pragma fini,c,gcc,pragma,C,Gcc,Pragma,我想构建一些代码,在加载共享库时调用一些代码。我想我会这样做: #pragma init(my_init) static void my_init () { //do-something } int add (int a,int b) { return a+b; } 所以当我用 gcc-fPIC-g-c-Wall tt.c 它回来了 gcc -fPIC -g -c -Wall tt.c tt.c:2: warning: ignoring #pragma init tt
#pragma init(my_init)
static void my_init () {
//do-something
}
int add (int a,int b) {
return a+b;
}
所以当我用
gcc-fPIC-g-c-Wall tt.c
它回来了
gcc -fPIC -g -c -Wall tt.c
tt.c:2: warning: ignoring #pragma init
tt.c:4: warning: ‘my_init’ defined but not used
所以它忽略了我的“pragmas”。我在实际代码中尝试了这一点,我的代码中止了,因为在pragma部分中没有调用函数,因为它被忽略了
如何让gcc使用这些#pragma init和fini语句?pragma几乎都是特定于编译器的。GCC不实现
init
,但您可以使用构造函数
函数属性获得相同的效果:
static __attribute__((constructor)) void my_init()
{
//do-something
}
还有一个相应的析构函数
属性。显然#pragma init
和#pragma fini
仅受Solaris的GCC支持:
在任何静态构造函数被调用之前,他可能需要调用他的代码,在这种情况下,这可能不起作用(初始化顺序不能被控制,并且不能保证),并且在标准C++中几乎不可能真正实现。如果没有,有什么不同?此外,该方法在所有C++实现中都是可移植的,而y-属性属性(构造函数)语法仅是GCC。我相信,y-属性(构造函数)语法确实保证它在所有其他代码之前调用。此外,它允许您为该构造函数指定优先级,以便在指定多个构造函数时,它知道以什么顺序运行它们。至于便携性,我是说,在任何静态类构造函数(即控制初始化)之前调用代码是不可能的,通过标准C++,没有可移植的方式来执行它。您只是简单地指出了我刚才所说的,而您的方法仍然不允许代码在任何静态类之前运行。@Grant Peters-现在才偶然发现它。问题是,静态构造函数也被称为“在所有其他东西之前”。我做了一些相关的工作,并很快进行了测试。至少ARM EABI GCC将C++构造函数调用和函数定义为与y.AtIdTeTyx((构造函数)”一起定义。在每个模块的基础上,使用_属性_((构造函数))定义的函数似乎排在第一位,但链接输出将所有这些函数混合在一起。这正是我要找的!嗯,对于GCC4.4.6,我得到了一个
预期的“,”或“;”在“{”标记之前
上述示例中出现错误。当我从函数定义中删除该属性并在其前面放置一个带有构造函数属性的函数声明时,它会按预期工作/@maxschlepzig:该属性需要在函数定义中的声明器之前,并进行更新。