动态库与静态库的使用和制作

动态库与静态库的使用和制作

C语言编译过程

首先我们需要了解一下在C语言中一个源文件和头文件经历的哪四个步骤编译为一个可执行程序。

在这里插入图片描述

如图:预处理->编译->汇编->链接

制作动态库或静态库的目的1在于优化代码开发和维护流程,提高代码的可重用性和模块化,简化版本管理和更新,同时有效管理内存资源。根据具体需求选择合适的库类型能够带来更好的性能和灵活性。目的2共享给别人的是一个二进制文件,虽然别人可以使用,但是无法知道你具体是怎么实现的,保护知识产权.

动态库

动态库的制作

gcc -shared 要制作的源文件名 -o lib动态库名.so
  1. 例如:现在要将这个作为动态库在这里插入图片描述

    那么我们的命令应该是:

    gcc -shared utils.c -o libutils.so
    

    其中libutils.so黄色是可以自己定义的任意名字。

  2. 这是会有一部分报错(这是因为Linux里面用的镜像不同导致的)

在这里插入图片描述

这是只需给制作动态库的命令加==-fPIC==,如下:

gcc -shared -fPIC utils.c -o libutils.so

动态库的使用

动态库的使用分为三种情况

情况1:使用动态库的源文件与动态库在同一文件夹下

gcc 源文件名 lib动态库名.so -o 可执行文件名

例如:在这里插入图片描述

gcc mains.c libutils.so -o a.out

注意:由于这是又有一部分人会报错(如果没有报错则已经制作成功)

在这里插入图片描述

如果在执行可执行程序时出现以上问题需要加入
export LD_LIBRARY_PATH=库文件所在路径:$LD_LIBRARY_PATH

例如:库文件所在路径:由于现在是在一个文件夹下只需加==./==

即: export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH

情况2:使用动态库的源文件与动态库不在同一文件夹下

gcc 源文件名 -o 生成的可执行文件名 -L库文件路径 -l库名 -I头文件所在路径

注意:

-L 是指定库文件的路径
-l 指定找哪个库,指定的只要库文件名 lib 后面 .so 前面的部分
-I 指定头文件的路径
如果出现一下问题,需要加入
export LD_LIBRARY_PATH=库文件所在路径:$LD_LIBRARY_PATH

在这里插入图片描述

例如:在这里插入图片描述

代码如下在这里插入图片描述

情况3:动态库文件在系统提供的文件夹下

系统提供的文件夹:
/usr/lib 		系统提供存储动态库的文件夹
/usr/include 	 系统提供存储头文件的文件夹
gcc 源文件名 -l 库文件名 -o 生成的可执行文件夹

例如:我们依然用上面文件名称为例

gcc mains.c -l utils -o a.out

静态库

静态库的制作

1,将要编译为库文件的源编译为二进制文件
		gcc -c 源文件名 -o 二进制文件名.o
2,将二进制文件转换为静态库文件
		ar rc lib库文件名.a 二进制文件名.o

在这里插入图片描述

命令为:在这里插入图片描述

完成后:在这里插入图片描述

此时libutils.a和utils.h就是我们的静态库。

静态库的使用

下面例子还以在这里插入图片描述

为例,其中libutils.a是静态库,utils.h是静态库头文件。

情况1:使用静态库的源文件与动态库在同一文件夹下

gcc -static 源文件名 lib动态库名.a -o 可执行文件名

例:gcc -static mains.c libutils.a -o a.out

情况2:使用静态库的源文件与动态库不在同一文件夹下

gcc -static 源文件名 -o 生成的可执行文件名 -L库文件路径 -l库名 -I头文件所
在路径

例:gcc -static mains.c -o a.out 后面就是路径了,库文件名不要带lib和.a (路径可以是绝对也可以是相对)

情况3:静态库文件在系统提供的文件夹

/usr/lib 		系统提供存储动态库的文件夹
/usr/include 	系统提供存储头文件的文件夹
gcc -static 源文件名 -l 库文件名 -o 生成的可执行文件夹

a (路径可以是绝对也可以是相对)

情况3:静态库文件在系统提供的文件夹

/usr/lib 		系统提供存储动态库的文件夹
/usr/include 	系统提供存储头文件的文件夹
gcc -static 源文件名 -l 库文件名 -o 生成的可执行文件夹

例:gcc -static mains.c -l utils -o a.out

  • 15
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值