2014-12-02 2 views
1

Я использую 64-разрядный gcc-4.8.2 для создания 32-битной цели, а моя машина - 64-разрядная. Я использую функции параллелизма C++ 11, такие как thread, mutex, conditiona_variables и т. Д.undefined ссылка на '__gthrw ___ pthread_key_create (unsigned int *, void (*) (void *))

Компонент дал вышеприведенное сообщение об ошибке при попытке связать исполняемый файл. 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 [email protected]@GLIBC_2.0 

где символ 'ghtrw___pthread_key_create' от? Я попытался добавить '-lpthread (-pthread)' как флаг компилятора, но это не помогает.

Дополнительная информация. nm libMyLib.so | Grep показывает потоковой другие символы, такие, как определено _ZL20__gthread_mutex_lockP15pthread_mutex_t

+0

'Я пытался добавить '-lpthread' в качестве флага компилятора' - вы знаете о [правильной последовательности параметров] (http://stackoverflow.com/questions/18388710/what-is-the-proper-sequence-of- опции-для-GCC-на-значение-в-этой последовательности)? – Gluttton

+3

Вместо этого используйте флаг компилятора '-pthread'. –

+0

Добавление '-pthread' не устраняет мою проблему. И все же вопрос, откуда приходит пропавший символ? – user11869

ответ

2

где символ «ghtrw___pthread_key_create» от?

Он определен в слое абляции GCC для gentreads для примитивов потоков в заголовке 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, поэтому он никогда не должен иметь определение, потому что это просто ссылка на внутренний __pthread_key_create символ GLibC в ,

Так что, похоже, что-то пошло не так, как вы строите библиотеку. У вас не должно быть неопределенного слабого символа.

+1

В прошлый раз я видел, что эта ошибка была с другим компилятором (oracle), который не определяет '__GNUC__', поэтому sys/cdefs определяет' __attribute __ (X) 'как ничто (sunCC предоставляет свои собственные sys/cdefs, чтобы этого избежать). –

+0

Я проверил, что __GNUC__ определен – user11869

+0

@Jonathan Wakely, я нашел это из документации gcc «Если целевой символ ссылается только на слабые ссылки, то становится слабым неопределенным символом». Я не совсем понимаю смысл этого предложения. Но может ли это быть причиной? – user11869