我正在编写一个基于 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 编译了二进制文件,在可预见的未来,它将在任何地方工作。而且,如果没有,它将导致链接器错误,而不是神秘的错误。
因此,最佳解决方案是:
- 从共享库的链接中完全放出libpthread(你不需要它来编译,你只需要它的符号来运行它(
- 是的,如果你使用 libfoo 编译二进制文件,你必须同时提供
-lfoo
和-lpthread
。
(2(不是一个很大的问题 - 有各种工具(如GNU autoconf(可以自动生成所需编译器/链接器标志的库。