2011-09-14 85 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 –