• linux静态链接库


    库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常

    本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)

    静态库

    之所以称为“静态库”,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。

    静态库与汇编生成的目标文件一起链接为可执行文件,那么静态库必定跟.o文件格式相似。其实一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件。

    特点

    • 可以实现共享代码
    • 不能再包含其他静态链接库
    • 本身包含了代码,地址符号表等,静态链接库的使用中,连接器从静态链接库获取所有被引用的函数,并将库同代码一起放到可执行文件中
    • 代码装载速度快,执行速度略比动态链接库快
    • 只需保证在开发者的计算机中有正确的 .a 文件,在以二进制形式发布程序时不需考虑在用户的计算机上 .a 文件是否存在及版本问题
    • 使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费;

    创建

    1. 编写源文件,通过 gcc -c xxx.c 生成目标文件
    2. 使用 ar 命令归档目标文件,生成静态库
    3. 配合静态库,写一个使用静态库中的函数的头文件
    4. 链接静态库,生成可执行文件

    例子

    源文件

    add.c 文件:

    int add(int a, int b)
    {
        return a + b;
    }

    subtract.c 文件:

    int subtract(int a, int b)
    {
        return a - b;
    }

    编译两个文件,生成目标文件 add.o subtract.o

    gcc -c add.c subtract.c

    归档目标文件,生成静态链接库 libmath.a

    使用 ar 命令将目标文件压缩到一起,并且对其进行编号和索引,以便于查找和检索

    ar rcv libmath.a add.o subtract.o

    有关 ar 命令的使用,makepage 有详细的说明,常用的选项是:

    c -- 如果库文件不存在,生成新的库文件,并不打印警告
    r -- 代替库中已有的文件或者插入新的文件
    v -- 输出详细信息
    d -- 删除库中的某个目标文件
    t -- 列出归档文件中包含的目标文件

    我们生成的库文件名字必须形如 libxxx.a,这样我们在链接库的时候,就可以使用 -lxxx。

    当我们链接时,指定 -lxxx,链接器就会在指定的目录查找 libxxx.a 或 libxxx.so 文件

    编写头文件 mymath.h

    #ifndef _MYMATH_H_
    #define _MYMATH_H_
    
    int add(int, int);
    int subtract(int, int);
    
    #endif

    使用静态库

    编写文件 main.c

    #include <stdio.h>
    #include "mymath.h"
    
    
    int main()
    {
        printf("%d, %d
    ", add(2, 3), subtract(9, 8));
    
        return 0;
    }

    编译链接

    gcc main.c -L. -lmath

    这里,-L 指定搜索链接库的包含当前目录

    使用Makefile

    .PHONY: all 
    all: build target
    
    build: libmath.a
    
    libmath.a: add.o subtract.o
        ar rc $@ add.o subtract.o
    
    add.o: add.c
        gcc -c $<
    subtract.o: subtract.c
        gcc -c $<
    
    target: a.out
    a.out: main.c
        gcc main.c -L. -lmath
    
    .PHONY: clean
    clean:
        rm *.o libmath.a a.out
  • 相关阅读:
    pwndbg + gdb8.2 + kali (2018-10-09)爬坑
    关于EOF
    ARM的PC和LR寄存器
    存档,IE漏洞,一直不会分析
    QQProtect.sys漏洞真有意思
    问题
    gapz注入代码
    Spring JdbcTemplate批量操作数据库
    消息中间件MQ基础理论知识
    Spring4.3.1 JDBCTemplate操作数据库
  • 原文地址:https://www.cnblogs.com/zuofaqi/p/10440126.html
Copyright © 2020-2023  润新知