在 linux 中创建共享库时如何包含依赖项信息?
How to include dependencies information when creating shared libraries in linux?
我正在编写一个基于 libpthread.so 的共享库。要构建它,我使用以下命令:
gcc -fPIC -shared -lpthread -o libfoo.so foo.c
但是当链接使用 libfoo.so 的文件时,我必须指定选项 -lpthread -lfoo
而不仅仅是 -lfoo
。此外,ldd libfoo.so
没有显示任何关于 libpthread.so.
的信息
那么,有什么办法可以避免“-lpthread”吗?
扩展@Someprogrammerdude 的评论:
Your command line is in the wrong order, you need to put the libraries
you want to link with last: gcc -fPIC -shared -o libfoo.so foo.c -lpthread
我会说,这样做是一件坏事。共享库链接其他共享库是不行的,因为:
- 最终使用它们的程序也可能使用您的 libpthread,但可能需要不同的版本。由于链接器符号是全局的(在进程内),链接同一个库的多个版本可能会导致最可怕、最糟糕的二进制可调试错误。考虑到它是伪随机的,将使用给定全局变量/api调用的哪个版本。
- 但是,使用同一个库的不同版本并没有问题。原因是这些库可以相互二进制兼容,并且可以通过相对较新的 glibc 功能很容易地决定(它使用特殊的链接器符号来决定兼容性)。
特别是在 glibc(其部分是 libpthread)中 long 二进制兼容性非常重要,所以这并不重要,使用 libpthread 编译二进制文件,它将在可预见的未来无处不在。而且,如果不是,它将导致链接器错误,而不是神秘的错误。
因此,最优解为:
- 从共享库的链接中完全释放出libpthread(你不需要它来编译,你只需要它在运行上的符号)
- 是的,如果您使用 libfoo 编译二进制文件,则必须同时提供
-lfoo
和 -lpthread
。
(2) 不是什么大问题 - 有各种工具(如 gnu autoconf) 可以 自动生成所需 compiler/linker 标志的库。
我正在编写一个基于 libpthread.so 的共享库。要构建它,我使用以下命令:
gcc -fPIC -shared -lpthread -o libfoo.so foo.c
但是当链接使用 libfoo.so 的文件时,我必须指定选项 -lpthread -lfoo
而不仅仅是 -lfoo
。此外,ldd libfoo.so
没有显示任何关于 libpthread.so.
那么,有什么办法可以避免“-lpthread”吗?
扩展@Someprogrammerdude 的评论:
Your command line is in the wrong order, you need to put the libraries you want to link with last:
gcc -fPIC -shared -o libfoo.so foo.c -lpthread
我会说,这样做是一件坏事。共享库链接其他共享库是不行的,因为:
- 最终使用它们的程序也可能使用您的 libpthread,但可能需要不同的版本。由于链接器符号是全局的(在进程内),链接同一个库的多个版本可能会导致最可怕、最糟糕的二进制可调试错误。考虑到它是伪随机的,将使用给定全局变量/api调用的哪个版本。
- 但是,使用同一个库的不同版本并没有问题。原因是这些库可以相互二进制兼容,并且可以通过相对较新的 glibc 功能很容易地决定(它使用特殊的链接器符号来决定兼容性)。
特别是在 glibc(其部分是 libpthread)中 long 二进制兼容性非常重要,所以这并不重要,使用 libpthread 编译二进制文件,它将在可预见的未来无处不在。而且,如果不是,它将导致链接器错误,而不是神秘的错误。
因此,最优解为:
- 从共享库的链接中完全释放出libpthread(你不需要它来编译,你只需要它在运行上的符号)
- 是的,如果您使用 libfoo 编译二进制文件,则必须同时提供
-lfoo
和-lpthread
。
(2) 不是什么大问题 - 有各种工具(如 gnu autoconf) 可以 自动生成所需 compiler/linker 标志的库。