前提要先了解gcc/g++编译器的基本命令
1.库的介绍
1)什么是库
库是二进制文件,是源代码文件的另外一种表现形式,是一些功能相近或相似的函数的集合体。
2)使用库有什么好处
- 提高代码的可重用性,还可以提高程序的健壮性。
- 减少开发者的代码开发量,缩短开发周期
3)库制作完成后,如何给用户使用
- 头文件—包含了库函数的声明
- 库文件—包含了库文件的代码实现
注意:库不能单独使用,只能作为其他执行程序的一部分完成某些功能,也就是说只能被其他程序调用才能使用。
库可分为静态库(static library)和动态库(shared library)
2.静态库
静态库可以认为是一些目标代码的集合,是在可执行程序运行前就已经加入到执行码中,成为执行程序的 一部分,按照习惯,一般以.a作为文件后缀名
静态库的命名一般分为三个部分:
前缀:lib
库名称:自定义即可,如test
后缀:.a
所以最终的静态库的名字应该为libtest.a
1)静态库的制作
下面以fun1.c,fun2.c和head.h三个文件为例讲述静态库的制作和使用,其中head.h中有函数的声明,fun1.c,fun2.c中有函数的实现
步骤1:将c源文件生成对应.o文件
gcc -c fun1.c fun2.c
或者分别生成.o文件
gcc -o fun1.o -c fun1.c
gcc -o fun2.o -c fun2.c
步骤2:使用打包工具ar将准备好的.o文件打包为.a文件
- 在使用ar工具的时候需要添加参数rcs
r 更新 c 创建 s 建立索引 - 命令:ar rcs 静态库名 .o文件
ar rcs libtest1.a fun1.o fun2.o
2)静态库的使用
静态库制作完成之后,需要将.a文件和头文件一起发布给用户。
假设测试文件为main.c,静态库文件是libtest1.a, 头文件为head.h
用到的参数: - -L:指定要链接的库所在目录
- -l:指定链接时需要的静态库,去掉前缀和后缀
- -I:指定main.c文件用到的头文件head.h所在的路径
gcc -o main1 main.c -L ./ -l test1 -I ./
3)静态库的优缺点 - 优点:
函数库最终被打包到应用程序中,实现函数本地化,寻址方便,速度快。
程序在运行时与库函数再无瓜葛,移植方便。 - 缺点:
消耗系统资源较大,每个进程使用静态库都要复制一份,无端浪费内存。
静态库会给程序的更新、部署和发布带来麻烦。
3.动态库
动态库在程序运行时才加载,当多个程序共用一个动态库的时候就可以节约内存资源。
按照习惯,动态库一般以.so结尾,共享库的命名一般分为三个部分:
前缀:lib
库名称:自定义即可,如test
后缀:.so
最终的静态库的名字应该为:libtest.so
1)动态库的制作
生成目标文件.o,此时要加编译选项-fpic
gcc -fpic -c fun1.c fun2.c
参数:-fpic创建与地址无关的编译程序(pic,position independent code),目的就是为了动态库能够在多个程序间共享。
生成共享库,此时要加链接器选项:-shared(指定生成动态链接库)
gcc -shared fun1.o fun2.o -o libtest2.so
2)动态库的使用
和静态库的参数相同
gcc -o main2 main.c -L ./ -I test2 -I ./
3)动态库的优缺点
- 优点
节省内存
部署升级更加方便,只需替换动态库即可,然后再重启服务。 - 缺点
加载速度比静态库慢
移植性差