使用__attribute __((弱))导致警告“冗余重新声明xxx”,有什么办法可以避免?

时间:2011-05-09 10:25:39

标签: c gcc

当我在this post中使用__attribute__ ((weak))时,我会收到gcc关于重新声明符号的警告,而我所做的只是添加一个属性。属性可以以不同方式附加吗?我得到的警告如下:

threads.c:53: warning: redundant redeclaration of ‘pthread_once’
/usr/include/pthread.h:478: note: previous declaration of ‘pthread_once’ was here

2 个答案:

答案 0 :(得分:3)

是 - GCC允许您使用#pragma weak将符号声明为弱,所以您可以这样做:

#include <pthread.h>

#pragma weak pthread_create
#pragma weak pthread_mutex_init
#pragma weak pthread_mutex_lock
#pragma weak pthread_mutex_unlock 
#pragma weak pthread_mutex_destroy

/* ... code ... */

(记录here。)

答案 1 :(得分:1)

您可以使用像http://cgit.freedesktop.org/xcb/pthread-stubs/那样的pthread存根库,这样就无需创建自己的存根。

如果你只需要在相当现代的系统上运行,libc将为大多数常用函数提供一组存根,以使线程安全或libpthread集成到libc中。请注意,pthread_once的存根可能无法调用传递的函数。 (有些库使用它来检测它们是否在线程或非线程编程环境中。)