程序的静态链接(5):使用静态库
静态库概述
静态库本质上就是一组目标文件的集合,在日常开发中,我们通常都需要依赖一些基础的库,用以实现基本的输入输出、字符串操作等功能,系统将包含这些功能的目标文件打包到单独的库文件中,程序编译时可以将这些目标文件静态链接进程序中使用。在Linux中,静态库以后缀为.a
的特殊存档文件进行存储,通常可以在标准目录/lib/
和/usr/lib
中找到。
静态库的创建
准备测试程序:
// add.c
int add(const int a, const int b)
{
return (a + b);
}
// sub.c
int sub(const int a, const int b)
{
return (a - b);
}
依次编译add.c、sub.c生成目标文件:
Aspiresky ~ # gcc -c add.c -o add.o
Aspiresky ~ # gcc -c sub.c -o sub.o
打包生成静态库
GNU binutils工具集中提供ar
命令用于将多个目标文件打包成独立的静态库文件,命令操作如下:
Aspiresky ~ # ar -c -r libarithmetic.a add.o sub.o
Aspiresky ~ # ar -t libarithmetic.a
add.o
sub.o
其中:
-c
选项:指定创建静态库;-r
选项:指定插入目标文件到静态库中;-t
选项:用于查看静态库中包含的目标文件。
这里需要注意的是,Linux下静态库文件的命名遵循一定的规范,通常是以lib
开头,紧接着是静态库名,以.a
为后缀名,即lib+静态库名+.a
。后续程序在引用静态库时,直接指定静态库名即可。
静态库的使用
准备测试程序:
#include <stdlib.h>
#include <stdio.h>
extern int add(const int, const int);
int main(int argc, char *argv[])
{
int opera1 = 5;
int opera2 = 10;
int result = 0;
result = add(opera1, opera2);
printf("Result: %d.", result);
return 0;
}
为了使用静态库,编译main程序时需要指定链接上面创建的静态库文件,链接器会自动从静态库中查找包含依赖符号的目标文件,并将其链入到最后的可执行文件当中:
Aspiresky ~ # gcc main.c -L./ -larithmetic -o main
其中:
-L
选项:指定静态库的搜索路径。对于存放在系统默认搜索路径下的静态库,可以不指定;-l
选项:指定需要链接的静态库名。
静态库搜索路径
在链接静态库时,系统会按照特定的顺序查找静态库文件。在Linux下,默认查找的优先级顺序如下:
- 链接静态库时手动指定的搜索路径,通常使用
-L
选项; - 环境变量
LIBRARY_PATH
配置的路径; - 默认的静态库搜索路径
/lib
、/usr/lib
。
相关参考
- 《程序员的自我修养——编译、装载与库》
- 《Linux二进制分析》