动静态库的制作与使用(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更新。
相关推荐
Y.O.U..4 分钟前
今日八股——C++
开发语言·c++·面试
melck7 分钟前
liunx日志查询常用命令总结
java·服务器·网络
go_bai33 分钟前
Linux环境基础开发工具——(2)vim
linux·开发语言·经验分享·笔记·vim·学习方法
ghostwritten34 分钟前
Docker Registry Clean
运维·docker·容器
Zhichao_9741 分钟前
【UE5 C++课程系列笔记】33——商业化Json读写
c++·ue5
niuniu_6661 小时前
简单的自动化场景(以 Chrome 浏览器 为例)
运维·chrome·python·selenium·测试工具·自动化·安全性测试
云边有个稻草人1 小时前
【C++】第八节—string类(上)——详解+代码示例
开发语言·c++·迭代器·string类·语法糖auto和范围for·string类的常用接口·operator[]
惊鸿一博1 小时前
c++ &&(通用引用)和&(左值引用)区别
开发语言·c++
这儿有一堆花2 小时前
Kali Linux 2025.1a:主题焕新与树莓派支持的深度解析
linux·运维·服务器