关于库(函数库)以及动态库,静态库的特点及制作步骤

本文介绍了C语言中动态库(libname.so)和静态库(libname.a)的特点和制作步骤。动态库编译的程序体积小,执行时需要系统环境变量中包含相应的库;静态库编译的程序包含库代码,执行时无需依赖外部库。动态库的制作涉及`-shared`和`-fPIC`选项,静态库则使用`ar`工具。文章还提醒了静态库编译时需添加`-static`选项,并提供了编译和执行的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

制作动态库,静态库,我有一些理解,同时也是以后自己方便查阅有个笔记,如有错误,请评论告知,谢谢!
库(函数库)
函数库是由系统建立的具有一定功能的函数的集合。库中存放函数的名称和对应的目标代码,以及连接过程中所需的重定位信息。用户也可以根据自己的需要建立自己的用户函数库。 (方便调用, 并对代码进行加密)
注意:库中存放功能函数, 不要将main函数封装进去.
动态库(libname.so)
特点
(1)使用库里面的函数编译可执行文件时,并不会将库里面的代码编译进去. 使用动态库编译的程序相对较小.
(2)由动态库编译的可执行文件,执行时需要系统环境变量中具备这个动态库, 否则无法运行.
制作:gcc -shared -fPIC -o lib库名.so .c .c …
.c .c …:所有功能函数.c文件
shared: 表示生成.so动态库文件
-fPIC: -fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。
每个库有一个或多个对应的头文件
(1)编译
gcc .c -o 可执行文件名 -I(大i) 跟头文件路径 -L 跟库文件路径 -l(小写l)库名
.c :主函数.c文件
可执行文件名:建议主函数名_so,方便以后知道是哪个文件生成的
-I(大i) 跟头文件路径:链接头文件
-l(小写l)库名: -l与之前库名无空格
库名:不要前缀lib,也不要后缀.so
系统环境变量中具备这个动态库 将动态库拷贝到/lib 或 /usr/lib 中
(2)执行
./可执行文件名
静态库(libmame.a)
特点
(1)使用库里面的函数编译可执行文件时,会将库里面的代 码编译进去. 使用静态库编译的程序相对较大.
(2)由静态库编译的可执行文件,执行时不需要系统环境变量中具备这个库, 也能运行.
制作:gcc .c -o .o -c
①.c:每一个.c,只能一个一个地生成.o文件
②ar cr lib库名.a .o .o … -c
ar :打包工具 可用来创建, 修改库文件, 提取库文件中 的.o 模块
c :一个选项,表示创建库,不管是否存在都创建库文件.
r :一个选项,表示将.o 模块插入到库里面.
.o .o …:所有功能函数.c文件生成的.o可重定向文件
(1)编译
gcc .c -o 可执行文件名 -I(大i) 跟头文件路径 -L 跟库文件路径 -l(小写l)库名 -static(看下面注意事项)
可执行文件名:建议主函数名_a,方便以后知道是哪个文件生成的
-I(大i) 跟头文件路径:链接头文件
-l(小写l)库名: -l与之前库名无空格
库名:不要前缀lib,也不要后缀.a
注意:当前路径下有动态库和静态库,会优先默认编译动态库,为了使用静态库编译时需要添加-static
(2)执行
./可执行文件名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖小邓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值