静态库 3个月前

编程语言
373
静态库

Linux中静态库是由 ar 生成的 现在的静态库已经不再普遍了,大部分程序都在使用动态库

  • Linux中静态库以 lib作为前缀, .a 作为后缀,即 libxxx.a
  • Windows中静态库一般lib作为前缀, 以lib作为后缀,, 即 libxxx.lib

1.生成静态链接库

静态库的生成需要先对源文件进行汇编操作(gcc -c) 以得到二进制文件格式(.o) 然后通过ar工具将目标文件打包以得到静态库文件(libxxx.a)

ar工具创建静态库有三个参数

  • 参数c:创建一个库,不管库是否存在,都将创建。
  • 参数s:创建目标文件索引,这在创建较大的库时能加快时间。
  • 参数r:在库中插入模块(替换)。默认新的成员添加在库的结尾处,如果模块名已经在库中存在,则替换同名的模块。

image

具体步骤如下

#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
image
EchoEcho官方
无论前方如何,请不要后悔与我相遇。
1377
发布数
439
关注者
2223774
累计阅读

热门教程文档

Javascript
24小节
Maven
5小节
Java
12小节
QT
33小节
React
18小节