一、 静态库的编译
1. 编译过程 (*.a) a是achieve的缩写
1.1 编译成目标文件
-static 可选
gcc -c -static 代码文件.c
1.2 归档成静态库
ar工具 (常用-r -t选项)
ar -r 静态文件名被归档的文件名
ar -r add.aadd.o
nm工具(查看函数符号表)
nm 静态库或动态库或目标文件或执行文件
1.3 使用静态库
gcc 代码文件 静态库
小例子:
使用静态库完成如下程序
输入一个菱形半径,打印菱形
输入整型封装成IOTool
菱形打印封装成Graphic
计划:
1. 实现输入
2. 实现菱形
3. 编译静态库
4. 调用静态库
1)input.c
#include <stdio.h> int inputInt(const char* info){ printf("please input the radiu of diamond\n"); int r; scanf("%d",&r); return r; }
2)diamond.c
#include <stdio.h> int diamond(int r){ int x,y; for(y = 0 ; y <= 2*r ; ++y){ for(x = 0 ; x <= 2*r ; ++x){ if(y == x+r || y == x-r || y == -x+r || y == -x+3*r){ printf("*"); }else{ printf(" "); } } printf("\n"); } }
3)main.c
#include <stdio.h> int main(){ int r = inputInt("asda"); diamond(r); }
效果图:
编译执行方式:
第一种:gcc main.c input.c diamond.c -omain
第二种:作为静态库进行编译执行
gcc -static -c input.c //产生input.o文件
gcc -static -c diamond.c
ar -r ku.a input.o diamond.o //利用input.o 和diamond.o文件产生ku.a 文件
gcc main.c ku.a -omain
./main //执行main程序
把静态库作为代码的一部分来编译
总结:
1. 什么是库?
函数等代码封装的二进制已经编译的归档文件
2. ar归档工具
3. 采用库的方式管理代码优点:
容易组织代码
复用
保护代码版权
4. 静态库的“静态”的含义:
编译好的程序运行的时候不依赖库
库作为程序的一部分编译连接
5. 静态库的本质
就是目标文件的集合(归档)
6. -static可选
2. 库的规范与约定
库命名规则:
lib库名.a.主版本号.副版本号.批号
一般就写“lib库名.a”就行了。
ar -r libdemo2.a iotool.o graphic.o
库的使用规则
-l库名
-L库所在的目录
gcc main.c -o main -l demo2 -L.
------------------------------------静态库的基本使用小结---------------------------------
1、静态库的生成与使用
生成:gcc -static -c input.c
gcc -static -c diamond.c
ar -r ku.a input.o diamond.o
使用:gcc main.c ku.a -o main
执行:./main
2、其他的常见命令
ar -r ku.a ku1.o ku2.o //利用ku1.o ku2.o 生成归档文件ku.a
ar -t ku.a //查看归档文件ku.a 的内容
ar -p ku.a //产看归档文件ku.a 的具体内容
同时还应注意以下写法:
gcc main.c input.c diamond.c -omain //将main.c input.c diamond.c 一起编译生成main程序