我面临着一个解释和理解可能稍微复杂的问题,因为给出整个图片太大且困难。
请原谅。
考虑以下 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 等。
线程由 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 中
如有任何指点,将不胜感激。据我了解信息很少...
Thanks
在 Linux 上,pthread 函数位于 libpthread 库中。所以你必须链接到那个。
使用 pthread 时,正确的方法是使用-pthread
,除其他外,它将链接到 pthread 库中。你有-pthread
为某些可执行文件标记,但不为其他可执行文件标记,也不为您的clients.so 库标记,因此在需要时添加该标记。
另外,请记住,当您创建共享库时,应该使用 -fPIC 标志编译源文件。
(而且,看来你正在打电话ld
直接生成 client.so 库,您确实应该使用 gcc 来进行链接。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)