程序的静态链接(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二进制分析》
posted @ 2020-07-08 22:50  Aspiresky  阅读(17)  评论(0编辑  收藏  举报