如何创建.a静态库(ar命令)

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 --