动静态库的制作与使用(Linux操作系统)

一、静态库制作

首先准备好需要做成库的源文件与头文件,如下示例:

注意:在制作库方法过程中不能有main函数。

如果代码是用c语言进行写的,执行以下语句把所有.c文件进行编译得到了.o文件。

cpp 复制代码
gcc -c *.c

使用ar指令把所有.o文件链接成静态库,如下:

cpp 复制代码
ar -rc libmyc.a *.o
  • -r(replace):此选项表示在插入文件到库时,若遇到同名的成员,则进行替换。它确保了库中的文件是最新的。

  • -c(create):这个选项用于创建一个新的库文件。如果指定的库文件已经存在,它并不会被覆盖,而是会报错提示文件已存在。

注意:在静态库命名时开头必须是lib,结尾必须是 .a 中间的才是它真正的名字,比如这里的myc。

这样动态库就制作完了,即libmyc.a。

二、动态库制作

源文件头文件不变,在生成静态库之后.o文件就没有用了我们把删除(rm *.o),以免干扰下面操作,重新生成.o文件并带-fPIC选项:

cpp 复制代码
gcc -c -fPIC *.c

fPIC:产⽣位置⽆关码(position independent code),这里先不做过多追究。

gcc提供了制作动态库的选项:-shared,如下生成动态库:

cpp 复制代码
gcc -shared *.o -o libmyc.so

注意:在动态库命名时开头必须是lib,结尾必须是 .so 中间的才是它真正的名字,比如这里的myc。

三、动静态库打包

我们把库和头文件分别装入一个相同的新建目录,例如这里新建立mylib1和mylib2,然后分别创建include拿来放头文件,创建lib拿来放库文件。结构如下:

使用tar指令打包。

cpp 复制代码
tar czf mylib1.tgz mylib1
tar czf mylib2.tgz mylib2

然后得到mylib1.tgz(静态库),mylib2.tgz(动态库),就可以把它们分享给好朋友使用了。

四、静态库使用

我们创建一个zhangsan目录模拟我们的好朋友张三,并把打包好的库给他,如下:

然后进行解包,如下指令:

cpp 复制代码
tar xzf mylib1.tgz
tar xzf mylib2.tgz

然后我们生成可执行文件时需要带以下选项,才能让系统找到库:

cpp 复制代码
-I:指定头⽂件搜索路径
-L:指定库路径
-l:指定库名
cpp 复制代码
gcc -o exe code.c -I ./mylib1/include -L ./mylib1/lib -l myc

以上写法未免也太麻烦,我们能不能让系统自己去找到它们呢?当然可以,只需要我们把头文件放到/usr/include下,把静态库放在/lib64下,就能被系统的默认路径找到,如下:

cpp 复制代码
sudo cp ./mylib1/include/* /usr/include
cpp 复制代码
sudo cp ./mylib1/lib/* /lib64
cpp 复制代码
gcc -o exe code.c -l myc

我们在生成可执行文件时,-l选项依然不能忘记,因为虽然gcc认识c语言库,但我们自己写的库它并不认识。

五、动态库使用

我们用同样的方法,使用动态库生成可执行文件。

cpp 复制代码
gcc -o exe code.c -I ./mylib2/include -L ./mylib2/lib -l myc

但我们可以尝试一下,exe其实并不能运行,因为它在运行时又找不到动态库了。

这是因为静态库在与我们写的程序进行链接生成可执行文件后就与程序绑定到一起了,也就是说它成为了程序的一部分了。而动态库需要在可执行文件开始执行后才开始加载。

我们可以使用以下四种方法让系统找到动态库:

  1. 拷⻉ .so ⽂件到系统共享库路径下,⼀般指 /usr/lib、/usr/local/lib、/lib64等。
  2. 向系统共享库路径下建⽴同名软连接。
  3. 更改环境变量: LD_LIBRARY_PATH。
  4. ldconfig⽅案:配置/ etc/ld.so.conf.d/ ,ldconfig更新。
相关推荐
利刃大大3 分钟前
【高并发服务器:前置知识】一、项目介绍 && 模块划分
运维·服务器·高并发·项目·cpp
aitav013 分钟前
⚡ WSL2 搭建 s5p6818 Linux 嵌入式开发平台(part 1):环境准备与架构设计
linux·嵌入式·wsl·wsl2
磨十三21 分钟前
C++ 类型转换全面解析:从 C 风格到 C++ 风格
java·c语言·c++
init_23611 小时前
路由策略和流量策略的常见配置
运维·服务器·网络
一袋米扛几楼981 小时前
【软件安全】fgets / strncpy / gets(不安全) / snprintf的对比
linux·服务器·安全
oioihoii2 小时前
从汇编角度看C++优化:编译器真正做了什么
java·汇编·c++
cpsvps2 小时前
海外云服务器压力测试,如何评估服务器性能与稳定性
运维·服务器·压力测试
危险库2 小时前
【UE4/UE5】在虚幻引擎中创建控制台指令的几种方法
c++·ue5·游戏引擎·ue4·虚幻
防搞活机2 小时前
ubuntu 服务器(带NVLink)更新显卡驱动 (巨坑!!)
linux·服务器·深度学习·ubuntu·gpu算力·显卡驱动
不是编程家2 小时前
Linux第二十二讲:数据链路层 && NAT && 代理服务 && 内网穿透
linux·运维·服务器