面对一个可能稍微复杂一点的问题,解释和理解,整个画面将是太大和困难。
请原谅。
考虑下面的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。
C ++ windows二进制文件:与MinGW一起使用的条件
LoadLibrary不重用加载的库
未定义的系统调用如何返回-1?
从64位应用程序使用32位共享库?
线程是由simulator.c创build的,这些线程可以访问写在其他文件中的函数。
在做做…像下面的错误出现。
/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中
将感谢任何指针。 我了解的信息是非常less的… … –
谢谢
如何在C / C ++中更改默认的exe图标?
如何在c#中缩短path并保持有效
为什么当我的Perl程序在cmd.exe中输出一个UTF-8编码的string时,我得到了最后一个八位字节?
模块隐藏删除/ sys / module / mymodule内容
如何让SuperBible的GLTools库在Ubuntu中工作? 或者一个替代?
在linux上,pthread函数存在于libpthread库中。 所以你必须链接到那个。
使用pthread时,正确的方法是使用-pthread编译和链接,除此之外,它将链接到pthread库中。 你有一些可执行文件的-pthread标志,但是不能用于其他的,而不是你的clients.so库文件,所以在需要的地方添加标志。
另外,请记住,在创建共享库时,应该使用-fPIC标志编译源文件。
(而且,好像你直接调用ld来生成client.so库,你真的应该用gcc做链接。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。