我正在写一个基于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/