#pragma init 和 #pragma fini 在 Linux 上使用 gcc 编译器

发布于 2024-08-25 09:35:56 字数 529 浏览 7 评论 0原文

我想构建一些代码,在加载共享库时调用一些代码。我想我会这样做:

#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。我在实际代码中尝试了这一点,但我的代码中止了,因为在编译指示部分中没有调用函数,因为它被忽略了。

我如何让 gcc 使用这些 #pragma init 和 fini 语句?

I would like to build some code which calls some code on loadup of the shared library. I thought i would do it like this:

#pragma init(my_init)

static void my_init () {  
  //do-something
}

int add (int a,int b) {  
  return a+b; 
}

So when i build that code with

gcc -fPIC -g -c -Wall tt.c

It returns

gcc -fPIC -g -c -Wall tt.c 
tt.c:2: warning: ignoring #pragma init 
tt.c:4: warning: ‘my_init’ defined but not used

So its ignoring my #pragmas. I tried this in real code and my code aborted because a function hadn't been called in the pragma section because it was ignored.

How do i get gcc to use these #pragma init and fini statements?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

小嗷兮 2024-09-01 09:35:56

编译指示几乎都是特定于编译器的。 GCC 没有实现 init,但您可以使用 constructor 函数属性获得相同的效果:

static __attribute__((constructor)) void my_init()
{  
  //do-something
}

还有一个相应的 destructor 属性。

pragmas are almost all compiler-specific. GCC doesn't implement init, but you can get the same effect using the constructor function attribute:

static __attribute__((constructor)) void my_init()
{  
  //do-something
}

There's also a corresponding destructor attribute.

梦醒灬来后我 2024-09-01 09:35:56

显然 #pragma init#pragma fini 仅受 Solaris 的 GCC 支持:

Apparently #pragma init and #pragma fini are only supported by GCC for Solaris:

夜清冷一曲。 2024-09-01 09:35:56

相反,使用 C++:

// init.cpp
namespace // an anonymous namespace
{
     class autoinit
     {
         public:
             ~autoinit(){ /* destruction code, if applicable */ }
         private:
             autoinit(){ /* content of myinit */ }
             static autoinit _instance;
     };

     autoinit 
     autoinit::_instance; // static instance forces static construction
}

Instead, use C++:

// init.cpp
namespace // an anonymous namespace
{
     class autoinit
     {
         public:
             ~autoinit(){ /* destruction code, if applicable */ }
         private:
             autoinit(){ /* content of myinit */ }
             static autoinit _instance;
     };

     autoinit 
     autoinit::_instance; // static instance forces static construction
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文