动静态库的制作与使用(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更新。
相关推荐
-森屿安年-26 分钟前
按身高排序
c++·算法
DYWorker00135 分钟前
Linux驱动:RK3568 GMAC + YT8531C 千兆以太网全流程解剖
linux
(Charon)2 小时前
【C++面试】vector底层原理:扩容、拷贝移动与迭代器失效
c++·面试
朔北之忘 Clancy2 小时前
青少年软编等考七级题解目录
开发语言·c++·青少年编程·gesp·csp·信奥赛·noi
吴声子夜歌2 小时前
Nginx应用与运维——Nginx负载均衡应用实战(二)
运维·nginx·负载均衡
lisanmengmeng2 小时前
NRPE 添加命令(一)
linux·运维·服务器
pt10432 小时前
CML网络仿真入门-2:使用CML模拟网络实验环境
运维·网络协议
汉克老师2 小时前
GESP2026年9月认证C++七级( 第一部分选择题(8~15题)精讲
c++·gesp·小学生·学c++编程
Mr_Macallon2 小时前
C++回顾(基础)(01)
c语言·开发语言·c++·学习
如意猴3 小时前
【C++】007 C/C++ 内存管理机制、malloc与new的区别及模板初阶
java·c++·算法