链接pthread库问题

Lip*_*eka 4 c linux makefile pthreads undefined-reference

面对一个可能稍微复杂的问题,解释和理解,因为给出整个画面会太大而且困难.

请原谅我.

考虑以下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
Run Code Online (Sandbox Code Playgroud)

我们从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'
Run Code Online (Sandbox Code Playgroud)

pthread.h已包含在client.c和libclient.c中

对任何指针都会感激不尽.我理解的信息非常少......

谢谢

nos*_*nos 11

在linux上,pthread函数存在于libpthread库中.所以你必须链接到那个.

在使用pthread时,正确的方法是使用p进行编译和链接-pthread,其中包括将在pthread库中链接.您拥有-pthread某些可执行文件的标志,但不适用于其他可执行文件,而不适用于您的clients.so库,因此请在需要时添加标记.

另外,请记住,在创建共享库时,应使用-fPIC标志编译源文件.

(并且,似乎你ld直接调用生成client.so库,你真的应该使用gcc来进行链接.)