一、什么是库
- 库文件是计算机上的一类文件,可以简单的把库文件看成一种代码仓库(二进制),它提供给使用者一些可以直接拿来用的变量、函数或类;
- 库是特殊的一种程序,编写库的程序和编写一般的程序区别不大,只是库不能单独运行。(因为要提供给别人使用)
- 库文件有两种,静态库和动态库(共享库),二者的区别是:静态库在程序的链接阶段被复制到了程序中;(根据GCC编译的原理,预处理—编译—汇编—链接(链接成可执行程序);其实静态库和动态库都是在链接阶段做的处理)动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。
- 库的好处:1. 代码保密(反编译);2. 方便部署和分发;
二、静态库的制作
1. 命名规则:
(1)Linux:libxxx.a
- lib:前缀(固定)【library库】;
- xxx:库的名字,自己起;
- .a:后缀(固定);
(2)Windows:libxxx.lib
2. 静态库的制作:最新版本7.5的GCC,链接静态库时不能加前缀lib和后缀.a,否则就会一直找不到库文件。所以看到最后,会给出解决方案
- gcc 获得.o文件(比如有10个文件,把10个文件打成一个库,就得先通过gcc获得.o文件);
- 将.o文件打包,使用ar工具(archive);
- ar rcs libxxx.a(要生成的库名) xxx.o xxx.o (要把哪些.o文件打包到库中,就都列出来);
- r:将文件插入备存文件中(往库文件中插入.o文件);
- c:建立备存文件(即库文件);
- s:索引(创建索引,因为静态库中里面的文件很多,通过s参数,会生成这些文件的索引,方便查找);
3. 静态库的制作操作
(1)通过vscode来连接Ubuntu 虚拟机
(2)创建lesson04文件夹
(3)接着再通过xftp将calc和library两个文件上传到服务器中
1. calc文件包括:关于计算的一些操作
- add.c:做加法运算;
- div.c:做除法运算;
- mult.c:做乘法运算;
- sub.c:做减法运算;
- main.c:对这些运算做一套测试;
- head.h:如下
#ifndef _HEAD_H
#define _HEAD_H
// 加法
int add(int a, int b);
// 减法
int subtract(int a, int b);
// 乘法
int multiply(int a, int b);
// 除法
double divide(int a, int b);
#endif
2. 而我们现在就是想把加减乘除这四个操作打包成一个静态库,让别人使用,那么怎么做?
- step one:生成这些文件的.o文件:(只进行汇编不去链接它)gcc -c add.c sub.c mult.c div.c
- step two:创建静态库:
4. 静态库的使用
1. 介绍library文件
- include目录下,放的都是要用到的头文件,例如head.h(即calc里面的头文件);
- lib目录(即library):需要使用到的一些库文件;
- main.c:测试文件;
- src目录下:放的都是源代码文件
2. 把libcalc.a库文件放入lib目录下
cp ../calc/libcalc.a ./lib [把calc目录下的libcalc.a 放入当前目录下的lib文件夹中]
3. 编译main.c程序(未加 -I参数会报什么错)
4. 编译main.c程序(加了 -I 参数后会报什么错):-I 指定头文件搜索路径
5. 编译main.c程序(-l指定加载哪个库,-L指定库搜索路径):注意跟的是库的名称(calc),而不是库文件的名字(libcalc.a)
- 到此为止, 就是静态库的使用了;
- 但是,在静态库的制作过程中,要注意的是,gcc .o文件的时候,要注意给出头文件的搜索路径,前面lesson04举例子能成功,是因为他们在一个目录下;