1、这些文件的目录结构是:
$ tree . |-- main.c `-- stack |-- is_empty.c |-- pop.c |-- push.c |-- stack.c `-- stack.h 1 directory, 6 files
2、我们把stack.c
、push.c
、pop.c
、is_empty.c
编译成目标文件:
$ gcc -c stack/stack.c stack/push.c stack/pop.c stack/is_empty.c
3、然后打包成一个静态库libstack.a
:
$ ar rs libstack.a stack.o push.o pop.o is_empty.o ar: creating libstack.a 库文件名都是以lib
开头的,静态库以.a
作为后缀,表示Archive。ar
命令类似于tar
命令,起一个打包的作用, 但是把目标文件打包成静态库只能用ar
命令而不能用tar
命令。选项r
表示将后面的文件列表添加到文件包,如果文件包不存在就创建它, 如果文件包中已有同名文件就替换成新的。s
是专用于生成静态库的,表示为静态库创建索引,这个索引被链接器使用。
4、然后我们把libstack.a
和main.c
编译链接在一起:
$ gcc main.c -L. -lstack -Istack -o main
5、链接共享库和链接静态库的什么区别
在链接libc
共享库时只是指定了动态链接器和该程序所需要的库文件,并没有真的做链接,
可执行文件main
中调用的libc
库函数仍然是未定义符号,要在运行时做动态链接。而在链接静态库时,
链接器会把静态库中的目标文件取出来和可执行文件真正链接在一起。
使用静态库的一个好处,链接器可以从静态库中只取出需要的部分(函数)来做链接。
==============