C++11 未定义对'的引用__gthrw_uuuupthread_key_create(无符号int*,void(*)(void*))

C++11 未定义对'的引用__gthrw_uuuupthread_key_create(无符号int*,void(*)(void*)),c++11,gcc,opensuse,gcc4.8,C++11,Gcc,Opensuse,Gcc4.8,我使用64位gcc-4.8.2生成32位目标,我的机器是64位的。我正在使用c++11并发特性,如线程、互斥、条件变量等 链接器在尝试链接可执行文件时给出了上述错误消息。libMyLib也是该项目的一部分 libMyLib.so: undefined reference to '__gthrw___pthread_key_create(unsigned int*, void (*)(void*)) nm libMyLib.so | grep pthread_key_create显示: U _Z

我使用64位gcc-4.8.2生成32位目标,我的机器是64位的。我正在使用c++11并发特性,如线程、互斥、条件变量等

链接器在尝试链接可执行文件时给出了上述错误消息。libMyLib也是该项目的一部分

libMyLib.so: undefined reference to '__gthrw___pthread_key_create(unsigned int*, void (*)(void*))
nm libMyLib.so | grep pthread_key_create显示:

U _ZL28__gthrw___pthread_key_createPjPFvPvE
w __pthread_key_create@@GLIBC_2.0
符号“ghtrw\uuuuu pthread\u key\u create”来自何处?我尝试添加“-lpthread(-pthread)”作为编译器标志,但没有帮助

更多信息。nm libMyLib.so | grep pthread显示其他符号,例如定义了_ZL20 u gthread _mutex _lockP15pthread _mutex

符号“ghtrw\uuuuu pthread\u key\u create”来自何处

它是在GCC的线程原语的“gthreads”抽象层中定义的,位于
gthr posix.h
头中

#if SUPPORTS_WEAK && GTHREAD_USE_WEAK
# ifndef __gthrw_pragma
#  define __gthrw_pragma(pragma)
# endif
# define __gthrw2(name,name2,type) \
  static __typeof(type) name __attribute__ ((__weakref__(#name2))); \
  __gthrw_pragma(weak type)
# define __gthrw_(name) __gthrw_ ## name
#else
# define __gthrw2(name,name2,type)
# define __gthrw_(name) name
#endif

/* Typically, __gthrw_foo is a weak reference to symbol foo.  */
#define __gthrw(name) __gthrw2(__gthrw_ ## name,name,name)

...

#ifdef __GLIBC__
__gthrw2(__gthrw_(__pthread_key_create),
     __pthread_key_create,
     pthread_key_create)
预处理后,扩展到:

static __typeof(pthread_key_create) __gthrw___pthread_key_create __attribute__ ((__weakref__("__pthread_key_create")));
它应该是对
\uu pthread\u key\u create
的弱引用,因此它不应该有定义,因为它只是对glibc的内部
\uupthread\u key\u create
符号的引用


因此,您构建库的方式似乎出了问题。您不应该有一个未定义的弱符号。

我最近偶然发现了这个错误,而不是因为缺少
-pthread

这种情况发生在一个有点不寻常的设置中:我在Centos7下编译一个用C++14编写的软件。因为C++14需要最新版本的GCC,所以我依赖它

鉴于特定的设置,我在Centos邮件列表上打开了一个线程,因此我直接引用了相关的线程。看到和

简言之,它可能是由预处理器宏中的某些错误(glibc或libgcc)引起的。可以通过将
#include
放在源代码的开头来修复它,一旦编译就会出现问题。是的,即使您没有在其中使用
std::thread


我并不是说这对每个人都有效,但它可能在某些特定情况下起作用。

我尝试将“-lpthread”添加为编译器标志
-您知道吗?请改用
-pthread
编译器标志。目标是什么?它的支持是否较弱?可能不相关,但gthr.h将mingw32Did的_GLIBCXX _GTHREAD _USE弱设置为0是否在编译过程中传递任何
-I
标志?您需要复制/粘贴可执行文件的精确编译行,mylib.so具有未定义符号的事实毫无意义(使用ldd/readelf检查mylib指向pthread的点)上一次我看到这个错误是在另一个编译器(oracle)中,它没有定义
\uuuu GNUC\uuuu
,所以sys/cdefs将
\uuuu属性(X)
定义为nothing(sunCC提供了自己的sys/cdefs来避免这个错误)。我检查了GNUC是否正确defined@Jonathan很快,我从gcc文档中找到了这个如果目标符号仅通过弱引用引用,则将成为弱未定义符号。“我不太明白这句话的意思。但这可能是原因吗?是的,可能是,但我希望
-lpthread
能够解析引用。是否可能您的系统上没有安装32位libpthread.so,因此忽略了
-lpthread
,而未解析弱引用?