在linux中创建共享库时如何包含依赖项信息?

时间:2017-07-16 11:33:25

标签: linux gcc shared-libraries

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

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

但是当链接使用libfoo.so的文件时,我必须指定选项-lpthread -lfoo而不只是-lfoo。此外,ldd libfoo.so并未显示有关libpthread.so的任何内容。

那么,有什么方法可以避免' -lpthread'?

1 个答案:

答案 0 :(得分:0)

扩展@Someprogrammerdude的评论:

  

您的命令行顺序错误,您需要放置库   您想要与上一个链接:gcc -fPIC -shared -o libfoo.so foo.c -lpthread

我会说,这样做是件坏事。链接其他共享库的共享库不合适,因为:

  • 最终使用它们的程序也可能使用你的libpthread,但它可能需要不同的版本。由于链接器符号是全局的(在进程内),链接同一个库的多个版本可能会导致最可怕,最糟糕的二进制可调试错误。考虑它是伪随机的,将使用给定全局变量/ api调用的哪个版本。
  • 但是,使用编译它的同一个库的不同版本不是问题。原因是这些库可以彼此二进制兼容,并且可以通过相对较新的glibc特性(它使用特殊的链接符号来决定兼容性)来轻松决定。

特别是在glibc(其部分是libpthread)中, long 二进制兼容性非常重要,所以它并不重要,使用libpthread编译你的二进制文件,它将在任何地方工作在可预见的未来。而且,如果没有,它将导致链接器错误,而不是神秘的错误。

因此,最佳解决方案是:

  1. 从共享库的链接中完全释放libpthread(你不需要它来编译,你只需要运行它的符号)。
  2. 是的,如果使用libfoo编译二进制文件,则必须同时给-lfoo-lpthread
  3. (2)不是一个很大的问题 - 有各种工具(比如gnu autoconf),可以自动生成所需编译器/链接器标志的库。