目录
1 静态库概念
其实库的概念。就是把一系列函数封装在一个二进制文件中,这一系列的函数的声明可以放在一个头文件中,写代码的时候直接包含头文件然后就可以直接使用库中的函数。在编译的时候要指定库,这样生成的二进制可执行文件是可以直接使用的。
这样做有什么好处呢?比如我们发明了某种新的算法,但是我们又不想把源码给别人,那么就可以把它们封装成库,然后通过头文件提供接口给别人,这样就不会泄露我们的源码。
2 静态库制作
三个步骤
一:把所有源文件编译为 .o 文件,即可重定向目标文件。
二:将.o文件打包成库,用 ar rcs libXXXX.a file1.o file2.o file3.o来打包生成 libname.a文件就是静态库文件,其中 libXXXX.a中 lib 和 .a是所有库名都有的公共部分,中间的部分才是真正的库名。
三:将头文件和库一起发布,因为头文件中有库中函数的声明,相当于使用的api,库就是上一步生成的libXXXX.a。
例子:封装一个计算器库,包含加减乘除等函数
第一步:
先写源代码,注意每一个源文件都包含了“head.h”,因此在把这些源文件编译成 .o 文件的时候一定要指定源文件路径。编译时用 -I指向头文件路径。
gcc -c add.c div.c mul.c sub.c -I ../include
第二步:
打包头文件
ar rcs libCalc.a *.o
注意库的真正名字是Calc
可以用nm命令来查看库中包含哪些函数
第三步:
发布头文件,这个没啥好说的,就是把库文件和头文件同时提供给别人,然后他们要用库的话就自己把头文件和库文件放在一个合适的位置就好了。
3 静态库使用
如下例子,写源代码的时候把头文件包含进来,然后编译的时候指定库和头文件地址即可生成可执行程序。
按照文件的分布编译的时候指定文件夹和库名
gcc main.c -o app -I ./include -L ./lib -l Calc
4 优劣点
优点:
执行快,因为目标文件中包含了所有执行需要的信息
发布应用时不需要发布头文件,因为使用了静态库生成的目标文件运行时候是不依赖于任何其它文件的,因此我们利用静态库生成的应用可以直接发布给别人使用,而不需要把静态库也给出去,毕竟目标文件本身就包含了运行需要的所有信息。
缺点:
可执行程序体积大,因为静态库中的函数生成的目标代码,直接全部都加入了最终的目标文件,在运行的时候直接加载进text代码段,所以可执行程序体积大,当然这也是目标文件执行快的原因。
库变更时要重新编译应用。如果库中某些功能改变了,要想使用这些改变的功能,则整个应用都要重新编译。