2011-09-14 4 views
3

Перед лицом проблемы, которая может быть немного сложной, чтобы объяснить и понять, поскольку полная картина будет слишком большой и сложной.ссылка на библиотеку pthread issue

Прошу прощения за это.

Рассмотрим следующий Makefile:

all: clients.so simulator backup 
    LD_PRELOAD=/home/Juggler/client/clients.so ./simulator 

backup: backup.c libclient.a 
    gcc backup.c -o backup -L /home/Juggler/client -L. -lclient -ldl 
simulator: simulator.c libclient.a 
    gcc -g simulator.c -o simulator -L /home/Juggler/client -L. -lclient -ldl -pthread 
libclient.a: libclient.o client.o 
    ar rcs libclient.a libclient.o client.o 
libclient.o:libclient.c 
    gcc -c libclient.c -o libclient.o -pthread 

clients.so: client.o client_invoke.o 
    ld -shared -o clients.so client_invoke.o client.o -ldl 
client_invoke.o: client_invoke.c 
    gcc -Wall -fPIC -DPIC -c -g client_invoke.c 
client.o: client.c 
    gcc -Wall -fPIC -DPIC -c -g client.c -ldl -pthread 

Мы называем функция, написанная в client.c от libclient.c и эти функции в client.c макияжем вызова pthread_key_create(), pthread_setspecific..etc.

Темы создавались simulator.c и импровизировали функции доступа, написанные в других файлах.

Выполнение ... Ошибки, подобные следующим.

/home/Juggler/client/libclient.a(client.o):In function 'setup_connection': 
/home/Juggler/client/client.c:35: undefined reference to 'pthread_setspecific' 

pthread.h был включен в обоих client.c и libclient.c

Был бы признателен за anypointers. Я понимаю, информация очень меньше ...

Благодаря

ответ

9

В Linux PTHREAD функция живет в libpthread библиотеки. Поэтому вы должны ссылаться на это.

Правильный способ использования pthreads состоит в том, чтобы скомпилировать и связать, используя -pthread, который, среди прочего, будет связан в библиотеке pthread. У вас есть флаг -pthread для некоторых ваших исполняемых файлов, но не для других, а не для вашей библиотеки clients.so, поэтому добавьте флаг, если требуется.

Кроме того, помните, что при создании общей библиотеки вы должны скомпилировать исходные файлы с флагом -fPIC.

(И, кажется, вы вызываете ld непосредственно для получения библиотеки client.so, вы действительно должны использовать GCC, чтобы сделать ссылки.)

+0

Спасибо ... Мне нужно добавить -pthread флага компилировать резервное копирование. с –

Смежные вопросы