动静态库的制作与使用(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更新。
相关推荐
jerry-8918 分钟前
系统安全及应用
linux·运维·服务器
Hunter_pcx19 分钟前
[C++技能提升]插件模式
开发语言·c++
叩叮ING40 分钟前
正则表达式中常见的贪婪词
java·服务器·正则表达式
AiFlutter1 小时前
在AlarmLinux系统中安装KeyDB
linux·运维·服务器
左手の明天1 小时前
【C/C++】C++中使用vector存储并遍历数据
c语言·开发语言·c++
PaLu-LI1 小时前
ORB-SLAM2源码学习:Initializer.cc(13): Initializer::ReconstructF用F矩阵恢复R,t及三维点
c++·人工智能·学习·线性代数·ubuntu·计算机视觉·矩阵
呆呆珝1 小时前
RKNN_C++版本-YOLOV5
c++·人工智能·嵌入式硬件·yolo
小徐同学14181 小时前
BGP边界网关协议(Border Gateway Protocol)路由聚合详解
运维·服务器·网络·网络协议·信息与通信·bgp
HaoHao_0101 小时前
AWS Outposts
大数据·服务器·数据库·aws·云服务器
HaoHao_0101 小时前
VMware 的 AWS
大数据·服务器·数据库·云计算·aws·云服务器