2011-09-14 122 views
3

我面臨的問題可能會稍微複雜一點,解釋和理解,因爲給整個圖片將是太大和困難。鏈接pthread庫問題

請原諒。

考慮下面的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 

我們稱之爲功能從libclient.c寫在client.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

將是anypointers感激。我理解的信息就非常少了......

感謝

回答

9

在Linux上,並行線程函數住在libpthread庫。所以你必須鏈接到那個。

當使用pthreads時,正確的方法是使用-pthread進行編譯和鏈接,除此之外,它將鏈接到pthread庫中。對於某些可執行文件,您擁有-pthread標誌,但不適用於其他人,而不適用於您的clients.so庫,因此請在需要時添加標誌。

另外,請記住,當您創建共享庫時,應該使用-fPIC標誌編譯源文件。

(而且,看來你是叫ld直接產生client.so庫,你真的應該使用gcc進行鏈接。)

+0

謝謝...我需要添加-pthread標誌編譯備份。 C –