связывание проблемы библиотеки pthread - PullRequest
4 голосов
/ 14 сентября 2011

Я столкнулся с проблемой, которая может быть немного сложной для объяснения и понимания, поскольку дать всю картину было бы слишком большим и трудным.

Пожалуйста, извините меня за это.

Рассмотрим следующий 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, и эти потоки обращаются к функциям, записанным в других файлах.

При выполнении make ... появляются следующие ошибки.

/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

Был бы благодарен за любые указатели. Я понимаю, что информации очень мало ...

Спасибо

1 Ответ

10 голосов
/ 14 сентября 2011

В Linux функции pthread находятся в библиотеке libpthread.Таким образом, вы должны ссылаться на это.

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

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

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

...