动静态库的理解、制作、使用。

一.动静态库的理解。

1.什么是库?

代码是无穷无尽的,当程序猿在写一些项目时,未必所有代码亲历亲为,他们可以在网上寻找大佬写过的一些有关需求的代码,这些代码可以让他们拿过来直接使用,而省去了许多精力。把一些代码进行打包,形成的便是库了。


上面所说,库就是将代码进行打包。这个说法是方便读者理解而所说的。要想进一步的理解库,我们要对程序的编译过程进行简单理解。

程序的编译有四道工序:预处理,编译,汇编,链接。

预处理:头文件展开,去注释,条件编译,宏替换。.c->.i

编译:将代码编译为汇编代码。.i->.s

汇编:将汇编代码转为可重定位的二进制文件。.s->.o

链接:链接库文件,形成可执行程序。.o->exe


库文件便是**.o文件的集合** ,当程序猿拥有了.o文件,每次复用这些代码就不需要从头开始编译,只需要拥有这些.o文件和对应的头文件,就可以轻松的使用别人的代码,在自己的.c文件中包头文件,编译时进行库的链接。

2.动静态库的区别

静态库:以拷贝的方式,将方法的集合(库)直接拷贝到可执行程序中。
动态库:以动态链接的方式,将要链接的库函数地址拷贝到可执行程序中。

静态库 将方法的集合(库)直接拷贝可执行程序中就决定了这个可执行程序在运行的时候不再需要库文件,可以在随意运行,但把库直接拷贝到可执行程序当中会导致可执行程序体积巨大。
动态库 相较于静态库更加灵活,可以做到一库同时被多个可执行程序使用,每个可执行程序内部只有库函数的地址,并不是将整个库内置入可执行程序中,让可执行程序体积小巧。

在linux 系统中:静态库后缀为**.a** 动态库后缀为**.so**

在windows 系统中: 静态库后缀为**.lib** 动态库后缀为**.dll**

二.动静态库的制作和使用。

接下来亲手制作动静态库来感受:

静态库的制作和使用:

我们将要制作一个简易的math库,库中包含加减乘除四种方法。在main.c中调用这些方法。

我们将mathlib文件夹中的**.c** 文件全部编译为**.o**二进制文件

.c文件已经没用了,删除

现在这个mathlib文件夹中只有头文件和二进制**.o** 文件了,我们将所有**.o文件打包形成静态库**,使用命令:

bash 复制代码
ar -rc libmath.a *.o   //将所有.o二进制文件打包形成math静态库

库已经制作完毕,将所有**.o**文件删除

现在mathlib文件夹中仅有静态库和头文件了。下面尝试编译main.c

这里涉及gcc编译时的一些选项:


动态库的制作和使用:

动态库的制作和静态库的制作在**.o** 文件打包之前完全相同,在**.o**文件打包形成动态库的时候改为gcc的命令:

bash 复制代码
gcc -shared -o libmath.so *.o

编译时和静态库做法也相同

只不过在运行可执行程序时会报错:原因是没有将可执行程序 和动态库建立动态链接。

下面提供多种动态链接的方法:

1.将动态库拷贝到系统库目录**/usr/lib64**中(运行时默认会在这里查找需要的库)

2.将动态库拷贝到可执行程序所在的目录 (运行时默认会在当前目录查找需要的库)

3.建立软链接(在当前目录或者**/usr/lib64**目录)

bash 复制代码
ln -s lib/mathlib.so mathlib.so

4.设置环境变量(LD_LIBRARY_PATH,默认会在这个环境变量里查找需要的库)

5.创建系统关于动态库的配置文件,

bash 复制代码
touch /etc/ld.so.conf.d/dy.conf

然后在新建的配置文件中添加动态库的绝对路径。

相关推荐
王振超wzc4 分钟前
嵌入式开发环境搭建--WM软件安装,Ubuntu操作系统安装
linux·运维·ubuntu
2501_937860941 小时前
中篇:TCP 为什么可靠又高效?滑动窗口、流量控制、拥塞控制与粘包全解析
服务器·网络·tcp/ip
QYRdata1 小时前
2026-2032年图形处理云服务器CAGR预计达18.7%
运维·服务器·服务发现
GeW2 小时前
制造强国底座:Linux与数据库驱动的新型工业基础设施
linux
xiaoye-duck2 小时前
《Linux 网络编程》深入理解 IO 多路复用:select 函数详解与 Echo 服务实战
linux·网络
Tairitsu_H2 小时前
[Linux系统] 命令行参数 | 环境变量 | 程序地址空间
linux·环境变量·命令行参数·程序地址空间
雯宝2 小时前
devices_init / buses_init / classes_init / firmware_init / hypervisor_init 函数
linux
极光通讯2 小时前
呆滞库存回收定价逻辑:如何评估DDR4内存和SATA SSD的回收价值
服务器·ssd
技术人生0012 小时前
VMware Workstation 安装 Ubuntu 24.04 LTS 完整教程
运维·服务器·ubuntu
YumiProxy3 小时前
动态IP冲突排查实战:从ARP检测到DHCP地址池的完整链路
服务器·网络·网络协议·tcp/ip·ip