Last Updated: 2023-06-19 03:06:51 Monday
-- TOC --
Linux下用后缀.a
表示静态库文件,它其实只是一堆.o
文件的集合,用ar工具来创建。
准备两个文件,add.c和show.c:
$ cat add.c
int add(int a, int b){
return a+b;
}
$ cat show.c
#include <stdio.h>
void show(int a){
printf("%d\n", a);
}
编译(不链接)后,将它俩放入libtt.a中:
$ gcc -c add.c show.c
$ ar crv libtt.a add.o show.o
a - add.o
a - show.o
可以用nm命令查看静态库中的.o文件和符号:
$ nm libtt.a
add.o:
0000000000000000 T add
show.o:
U printf
0000000000000000 T show
写个test.c,链接libtt.a:
#include <stdio.h>
int add(int,int);
void show(int);
int main(){
show(add(1,2));
return 0;
}
编译链接输出:
$ gcc test.c -o test -L. -ltt
$ ./test
3
-L. -ltt
,这部分要放在命令行后面,并且只能写tt,这就要求静态库的名字,必须是lib<name>.a
这种风格。
上面的示例,刻意在show.c中使用了printf,test.c要链接静态库,但并不需要使用-static
参数,还是动态链接了libc。
ar命令
ar命令是GNU Binutils的一员,可以用来创建、修改静态库,也可以从静态库中提取单个模块。静态库是一个独立的文件,里面包含了按照特定的结构组织起来的其它的一些文件(称做此库文件的member)。原始文件的内容、访问模式、时间戳、属主和组等属性都保留在库文件中。
ar命令行参数可以不用-
。
c
,create,创建库
r
,replace,当要增加的member在库中已经存在时
v
,verbose
t
,table,显示库中的member文件
$ ar t libtt.a
add.o
show.o
$ ar t /lib64/libc.a | less
x
,extract,提出member文件
$ ar x /lib64/libc.a memcpy.o
d
,delete,删除member文件
s
,更新库中符号索引,效果等同于运行ranlib,如果链接时有错误,可以尝试一下这个参数。
静态链接
链接以.o文件为单位进行,函数接口的符号存在于.o文件的.text段。libc.a中将每一个函数接口用给一个独立的.o文件包裹,在代码层面,就是每个.c文件内只有一个函数接口。这样做静态链接,就不会将无关的接口代码链接进目标中。
本文链接:https://cs.pynote.net/sf/c/cdm/202303021/
-- EOF --
-- MORE --