C语言-C库封装

C库

库的概念

​ 就是把一些常用函数的目标文件打包在一起,提供相应函数的接口,便于程序员使用;本质上来说库是一种可执行代码的二进制形式

库的分类

静态库和动态库,本质区别是代码被载入时刻不同。

1) 在程序编译时会被连接到目标代码中。

优点:

​ 程序运行时将不再需要该静态库;
​ 运行时无需加载库,运行速度更快

缺点:

​ 静态库中的代码复制到了程序中,因此体积较大;
​ 静态库升级后,程序需要重新编译链接

2)是在程序运行时才被载入代码中。

优点:

​ 程序在执行时加载动态库,代码体积小;
程序升级更简单;
不同应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。

缺点:

​ 运行时还需要动态库的存在,移植性较差

动态库 静态库
linux .so .a
windows .dll .lib

image-20250220201223741

静态库的制作

1.将源文件编译生成目标文件
==gcc -c xxx.c -o xxx.o==

image-20250220200842432

2.创建静态库,用ar 命令,将.o文件生成.a文件
==ar crs libxxx.a xxx.o==

image-20250220200854733

3.测试静态库的使用
==gcc main.c -L指定的库的路径-l指定库名==

image-20250220200915176

4.运行查看结果

image-20250220201053489

动态库的制作

1.创建一个与地址无关的目标文件
==gcc -fPIC -c xxx.c -o xxx.o==

image-20250220200508301

2.创建动态库
==gcc -shared -o libxxx.so xxx.o==

image-20250220200529425

3.测试使用
==gcc xxx.c -L指定路径 -l指定的库名==

4.执行

image-20250220200554177

错误原因
动态库被加载时会优先从/lib下寻找库文件

解决方法

1.把库文件拷贝到 /usr/lib
sudo cp libxxx.so /usr/lib

2.在LD_LIBRARY_PATH环境变量中加上库所在路径。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

注意:只在当前终端有效

3.添加/etc/ld.so.conf.d/*.conf文件

思路 : 将libxxx.so文件移到环境变量中或者使本文件所在目录添加到环境变量中

上一篇
下一篇