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



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

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

但是在链接使用 libfoo.so 的文件时,我必须指定选项-lpthread -lfoo而不仅仅是-lfoo。此外,ldd libfoo.so没有显示有关 libpthread.so 的任何信息。

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

扩展@Someprogrammerdude的注释:

你的命令行顺序错误,你需要把库放 您想链接到 LAST:gcc -fPIC -shared -o libfoo.so foo.c -lpthread

我想说,这样做是一件坏事。链接其他共享库是不行的,因为:

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

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

因此,最佳解决方案是:

  1. 从共享库的链接中完全放出libpthread(你不需要它来编译,你只需要它的符号来运行它(
  2. 是的,如果你使用 libfoo 编译二进制文件,你必须同时提供-lfoo-lpthread

(2(不是一个很大的问题 - 有各种工具(如GNU autoconf(可以自动生成所需编译器/链接器标志的库。

相关内容

  • 没有找到相关文章

最新更新