我正在写一个基于libpthread.so的共享库。要构建它,我使用以下命令:

gcc -fPIC -shared -lpthread -o libfoo.so foo.c

但是当链接使用libfoo.so的文件时,我必须指定选项-lpthread -lfoo而不仅仅是-lfoo。此外,ldd libfoo.so没有显示任何关于libpthread.so的内容。
那么,有什么方法可以避免'-lpthread'?

最佳答案

扩展@someprogrammerdude的评论:
你的命令行顺序不对,你需要把库
您要与上一个链接:gcc -fPIC -shared -o libfoo.so foo.c -lpthread
我会说,这样做是件坏事。链接其他共享库的共享库不正常,因为:
最终使用它们的程序也可能使用libpthread,但它可能需要不同的版本。由于链接器符号是全局的(在进程内),链接同一个库的多个版本可能会导致最可怕、最糟糕的二进制可调试错误。假设它是伪随机的,将使用给定全局变量/api调用的哪个版本。
但是,使用为其编译的同一个库的不同版本并不是问题。原因是库之间可以是二进制兼容的,并且可以很容易地由相对较新的glibc特性决定(它使用特殊的链接器符号来决定兼容性)。
特别是在glibc(其部分是libpthread)中,长二进制兼容性非常重要,所以这并不重要,使用libpthread编译二进制文件后,它将在可预见的将来在任何地方都能工作。如果没有,它将导致链接器错误,而不是神秘的错误。
因此,最佳解决方案是:
从共享库的链接中完全释放libpthread(不需要编译,只需要运行它的符号)
是的,如果使用libfoo编译二进制文件,则必须同时给出-lfoo-lpthread
(2)不是一个很大的问题-有各种工具(如gnu autoconf)可以自动生成所需编译器/链接器标志的libs。

关于linux - 在Linux中创建共享库时如何包含依赖项信息?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45128068/

10-11 19:33