我正在使用64位gcc-4.8.2生成32位目标,而我的机器是64位。我正在使用c ++ 11并发功能,如thread,mutex,conditiona_variables等。
尝试链接可执行文件时,链接器给出了上述错误消息。 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___pthread_key_create'来自哪里?我尝试添加'-lpthread(-pthread)'作为编译器标志,但它没有帮助。
更多信息。 nm libMyLib.so | grep pthread显示其他符号,例如_ZL20__gthread_mutex_lockP15pthread_mutex_t已定义
答案 0 :(得分:4)
其中是符号' ghtrw ___ pthread_key_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")));
它应该是对__pthread_key_create
的弱引用,因此它永远不应该有定义,因为它只是对glibc的内部__pthread_key_create
符号的引用。
所以看起来你构建图书馆的方式出了问题。你不应该有一个未定义的弱符号。
答案 1 :(得分:1)
我最近偶然发现了这个错误,而不是因为缺少-pthread
。
情况发生在一个不寻常的设置中:我正在编译一个用Centos7下的C ++ 14编写的软件。由于C ++ 14需要最新版本的GCC,我依靠devtoolset 6来实现它。
鉴于具体的设置,我在Centos邮件列表上打开了一个帖子,所以我直接引用相关的线程。请参阅https://lists.centos.org/pipermail/centos-devel/2018-May/016701.html和https://lists.centos.org/pipermail/centos-devel/2018-June/016727.html
简而言之,它可能是由预处理器宏中的一些错误引起的,无论是glibc还是libgcc。可以通过将#include <thread>
放在源代码的开头来修复,这会在编译后产生问题。是的,即使您没有使用std::thread
。
我并不认为这适用于所有人,但它可能会在某些特定情况下发挥作用。