ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Linux初学记第四章--有关库同学的那些事

2026/8/14 14:57:27 拓冰建站 浏览量
Linux初学记第四章--有关库同学的那些事

什么是库文件

简单来说,库文件就是别人写好、编译完成、封装好的一个现成的代码包,这可以让我们不用从零开始写代码,直接调用库里面的函数就可以实现功能。Linux系统中存储的库的位置一般在/lib和/usr/lib。在64位系统上有一些库的位置可能还在/usr/lib64下。

库分为两种,一种是静态库,它的命令规则是libxxx.a,还有一种是共享库,命令规则是libxxx.so。

静态库的生成与使用

静态库的生成

下面是需要生成静态库的.c文件 其中"foo.h"中是函数的声明 "add.c"和"max.c"是函数的定义

在这里我们先说一下为什么要让.c文件生成静态库,其实上一章已经有提到原因:

我们是可以将全部的.c文件一起参与编译链接生成可执行文件,但如果工程文件很多的时候,这样做就会非常浪费时间,编译速度很慢,而我们的静态库.a是编译完成后的二进制文件,别人调用的时候不用再编译我们的源码,只进行链接就行。并且我们打包成为一个库文件就避免文件紊乱,只需要传递一个文件加头文件即可。

然后我们将这些.c文件都编译为.o文件

使用ar命令将编译的所有.o文件生成静态库

此处我们看到的libfoo.a就是我们生成的静态库

c 创建库

r 将方法添加到库中

v 显示其过程

静态库的使用

首先先写一个main.c

再使用静态库"libfoo.a"和"main.c"生成可执行文件

-L 指定库的存储路径 告诉gcc去哪里找库文件

. 代表当前文件夹

-l 指定库的名称 链接库

共享库的生成与使用

共享库的生成

下面是需要生成共享库的.c文件 其中"foo.h"中是函数的声明 "add.c"和"max.c"是函数的定义

其实和静态库过程一样,首先我们还是要把需要生成库文件的所有".c"文件编译成".o"文件

然后使用gcc命令将第一步编译的所有".o"文件生成共享库

- 程序的选项(参数开关)

-shared 告诉gcc生成共享库

-fPIC 告诉编译器在编译.o的时候要生成不绑定固定内存地址的机器码

PIC Position-Independent Code位置无关代码 普通.o目标文件代码地址是写死的,动态库,要可以被不同程序加载到内存任意位置运行,不可以写死地址

-o 指定输出文件(output)

共享库的使用

以下是测试代码main.c的内容

再使用共享库"libfoo.so"和"main.c"生成可执行文件,并进行执行

如果在库的存储路径有相同的共享库和静态库,gcc默认使用共享库

在这里我们会发现出错了,是因为系统加载共享库时,找不到对应的共享库文件,因为系统一般默认去存储库的标准位置去加载(/lib或/usr/lib等),而不会在当前位置下寻找。

所以将库拷贝到/usr/lib下,再执行程序

如果库不在标准位置下,也可以通过设置环境变量"LD_LIBRARY_PATH"来指定加载库的路径。

同时,我们还解锁了一个功能,可通过ldd命令查看可执行程序使用了哪些共享库

静态库与共享库的区别

静态库会把用到的函数实现拷贝到可执行程序中,只拷贝用到的方法。

共享库链接时,不拷贝,只做标记,在运行程序时还需要链接,共享库装载到内存中多个程序可以共享使用。

使用共享库可以节省内存,很多程序同时使用foo库,内存里面只需要加载一份libfoo.so,不是每个程序都要复制一份库代码;升级也方便,直接替换新的libfoo.so文件,程序功能就更新;程序体积也小。