编程语言
373
Linux中静态库是由 ar 生成的 现在的静态库已经不再普遍了,大部分程序都在使用动态库
- Linux中静态库以
lib
作为前缀,.a
作为后缀,即libxxx.a
- Windows中静态库一般以
lib
作为前缀, 以lib
作为后缀,, 即libxxx.lib
1.生成静态链接库
静态库的生成需要先对源文件进行汇编操作(gcc -c) 以得到二进制文件格式(.o) 然后通过ar工具将目标文件打包以得到静态库文件(libxxx.a)
ar工具创建静态库有三个参数
- 参数c:创建一个库,不管库是否存在,都将创建。
- 参数s:创建目标文件索引,这在创建较大的库时能加快时间。
- 参数r:在库中插入模块(替换)。默认新的成员添加在库的结尾处,如果模块名已经在库中存在,则替换同名的模块。
具体步骤如下
#1.对源文件进行汇编,得到二进制(.o)文件 gcc 源文件(*.c) -c #-c位置没有要求 #2.将.o文件进行打包,得到静态库 ar csr 静态库的名字(libxxx.a) 原材料(*.o) #3.发布静态库 提供头文件 **.h文件 提供静态库 libxxx.a
eg:
#生成.o gcc add.c div.c mult.c sub.c -c #可能会提示头文件找不到,添加参数 -I 重写头文件路径 gcc add.c div.c mult.c sub.c -c -I ./include/ #将.o打包 ar rcs libcalc.a *.o #发布 /include 中的头文件和打包出来的 libcalc.a
2.静态库的使用
#假设我们已经将测试程序,头文件,静态库都放在了当前同一个目录中 #编译测试程序,生成可执行文件 gcc main.c -o app #此时会报错 undefined reference
报错原因:
编译的源文件中包含了头文件 head.h, 这个头文件中声明的函数对应的定义(也就是函数体实现)在静态库中,程序在编译的时候没有找到函数实现,因此提示 undefined reference to xxxx。
解决方案:
- -L: 指定库所在的目录(相对或者绝对路径)
- -l: 指定库的名字, 需要掐头(lib)去尾(.a) 剩下的才是需要的静态库的名字
gcc main.c -o app -L ./ -l calc