linux下的静态库

推荐一下B站有关静态库的视频,讲的挺好的

前言(静态库及动态库)

不管是静态库还是动态库,其本质上都是源文件,只不过是二进制格式只有计算机n能够识别,作为一个普通人就无能为力了。

用途

在项目中使用库一般有两个目的,一个是为了使程序更加简洁不需要在项目中维护太多的源文件,另一方面是为了源代码保密,毕竟不是所有人都想把自己编写的程序开源出来。

1.生成静态库

生成静态库,首先需要对源文件进行汇编操作(使用参数-c)得到二进制格式的目标文件(.o格式

//关于静态库制作的代码指令部分
wzf@ubuntu16:~/project$ ls
add.c  add.h  main.c  sub.c  sub.h
wzf@ubuntu16:~/project$ gcc -c *.c //生成目标文件.o是带参数-c ,而*.c是当前路径所有.c文件,一次性生成所有.o文件。也可以分开生成,即gcc -c main.c -o main.o    gcc -c add.c -o add.o  gcc -c  sub.c -o sub.o 
wzf@ubuntu16:~/project$ ls
add.c  add.h  add.o  main.c  main.o  sub.c  sub.h  sub.o //生成了.o文件

然后通过ar工具将目标文件打包就可以得到静态库文件了(libxxx.a)
在linux中静态库名字必须以lib作为前缀,以.a作为后缀,中间是库的名字自己指定即可,即 libxxx.a
使用 ar工具创建静态库的时候需要三个参数:

  • 参数c:创建一个库,不管库是否存再,都将创建
  • 参数s:创建目标文件索引,这在创建较大的库时能加快时间。
  • 参数r:替换归档文件中已有的文件或加入新文件
wzf@ubuntu16:~/project$ ar crs libname.a add.o sub.o  将需要打包的add.o和sub.o文件通过ar工具的crs命令选项进行打包成libname.a
wzf@ubuntu16:~/project$ ls
add.c  add.h  add.o  libname.a  main.c  main.o  sub.c  sub.h  sub.o
wzf@ubuntu16:~/project$ rm *.o  //生成静态库后就可以删除所有.o目标文件了
wzf@ubuntu16:~/project$ ls
add.c  add.h  libname.a  main.c  sub.c  sub.h


2.用生成静态库来编译程序

wzf@ubuntu16:~/project$ gcc main.c -o main -L. -lname   
wzf@ubuntu16:~/project$ ./main
add_fun
sub_fun

-L后面加指定编译的时候搜索的库的路径,这里加了.代表当前路径,也可以写-L .可以有空格。
-l(小写L)后面加编译的时候指定的静态库名,把前缀和后缀去掉,libname.c去掉前缀就是name。
然后执行可执行文件main就可以正常输出了。

这里附上我main.c里面测试的代码:

#include <stdio.h>
#include "add.h"
#include "sub.h"

int main(void)
{
	add_fun();
	sub_fun();

	return 0;
}

静态库的优缺点
优点:

  • 静态库被打包到应用程序中加载速度快
  • 发布程序无需提供静态库,移植方便

缺点:

  • 相同的库文件数据可能在内存中被加载多份,消耗系统资源,浪费内存
  • 库文件更新需要重新编译项目文件,生成新的可执行程序,浪费时间。

注意:静态库是在程序编译时就和main.c文件一起被加载进可执行文件的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值