了解 Linux 如何使用库,包括静态库和动态库的差别,有助于你解决依赖问题。
Linux 从某种意义上来说就是一堆相互依赖的静态和动态库。对于 Linux 系统新手来说,库的整个处理过程简直是个迷。但对有经验的人来说,被构建进操作系统的大量共享代码对于编写新应用来说却是个优点。
为了让你熟悉这个话题,我准备了一个小巧的 应用例子 来展示在普通的 Linux 发行版(在其他操作系统上未验证)上是经常是如何处理库的。为了用这个例子来跟上这个需要动手的教程,请打开命令行输入:
$ git clone https://github.com/hANSIc99/library_sample
$ cd library_sample/
$ make
cc -c main.c -Wall -Werror
cc -c libmy_static_a.c -o libmy_static_a.o -Wall -Werror
cc -c libmy_static_b.c -o libmy_static_b.o -Wall -Werror
ar -rsv libmy_static.a libmy_static_a.o libmy_static_b.o
ar: creating libmy_static.a
a - libmy_static_a.o
a - libmy_static_b.o
cc -c -fPIC libmy_shared.c -o libmy_shared.o
cc -shared -o libmy_shared.so libmy_shared.o
$ make clean
rm *.o
当执行完这些命令,这些文件应当被添加进目录下(执行 ls 来查看):
my_app
libmy_static.a
libmy_shared.so
关于静态链接
当你的应用链接了一个静态库,这个库的代码就变成了可执行文件的一部分。这个动作只在链接过程中执行一次,这些静态库通常以 .a 扩展符结尾。
静态库是多个目标object文件的归档archive(ar)。这些目标文件通常是 ELF 格式的。ELF 是 可执行可链接格式Executable and Linkable Format 的简写,它与多个操作系统兼容。
file 命令的输出可以告诉你静态库 libmy_static.a 是 ar 格式的归档文件类型。
$ file libmy_static.a
libmy_static.a: current ar archive
使用 ar -t,你可以看到归档文件的内部。它展示了两个目标文件:
$ ar -t libmy_static.a
libmy_static_a.o
libmy_static_b.o
知道去哪找这些关键库可以让库链接失效的问题成为历史。
虽然刚开始会有点困惑,但是理解 Linux 库的依赖管理是一种对操作系统掌控感的表现。在其他应用程序中运行这些步骤,以熟悉常见的库,然后继续学习怎样解决任何你可能遇到的库的挑战。
原文地址:https://linux.cn/article-13318-1.html