Linux 库的制作

本篇博文记录一下Linux的动态库和静态库的生成。

1. 静态库

1.1 命名规则

  • lib+库的名字+.a,例如libmytest.a

1.2 制作步骤

  • 使用-c参数,将一个.c生成一个.o

  • 将生成的.o工具打包,使用工具ar

    1
    2
    ar -rsc  库名 生成的所有的.o
    ar -rsc libmytest.a a.o b.o c.o

1.3 发布和使用

  • 不要给.c的源代码,只用给.o文件

  • 函数接口通过头文件给用户

  • 一个例子

    1
    2
    gcc -c *.c -I ../head  #生成目标文件
    ar rcs libMyCalc.a *.o #生成静态库文件

    使用的时候可以有如下两种操作

    1
    2
    3
    gcc main.c lib/libMyCalc.a -o out -I head
    #or
    gcc main.c -L lib -l MyCalc -I head -o out

1.4 分析

  • 使用nm libMyCalc.a查看库的.o文件
  • 使用静态库的时候,程序中需要什么文件,那么可执行文件中就只会打包使用到的.o文件中
  • 优点:
    • 发布时不需要提供库文件
    • 库的加载速度很快
  • 缺点:
    • 库打包到应用程序中,会导致发布的文件很大
    • 库发生了改变,需要重新编译程序

2. 动态库(共享库)

2.1 命名规则

  • lib + 库名 + .so

    1
    libMyTest.so

2.2 制作步骤

  • 生成与位置无关的代码.o

    1
    gcc -fPIC -c *.c -I ./head

    什么叫做与位置无关?

    Linux每个运行的程序操作系统都会为其分配一个0~4G(针对32位系统而言)的虚拟地址空间,大致排列如下

    4G:Linux Kernel :内存管理、进程管理、设备驱动管理、VFS虚拟文件系统

    3G:环境变量(env)

    ​ 命令行参数(int main (int argc, char* argv[])中的argv[]

    ​ 栈空间(小)

    ​ 共享库空间(C标准库,Linux系统I/O函数)

    ​ 堆空间(大)

    ​ .bss(未初始化全局变量)

    ​ .data(已初始化全局变量)

    ​ .text (代码段,二进制机器指令)

    0: 受保护的地址(0~4k)

    静态库每次被打包到可执行文件中,都会被分配空间,而且是固定的位置(使用的是绝对地址)

    动态库的函数放到共享库空间,每次放到的地方都是不一定的(位置是相对地址)

  • .o打包成文件

    1
    gcc -shared -o libMyTest.so *.o -I ./head

2.3 使用

  • gcc main.c lib/libMyTest.so -o app -I ./head
    
    1
    2
    3

    - ```bash
    gcc main,c -I ./head -L ./lib -l MyTest -o app
    使用的时候应该由一个提示,提示链接不到 使用`ldd`命令查看可执行程序所依赖的所有动态库 解决方法: - 将`so`文件拷贝到`lib`中,就可以执行可执行程序了 但是这种方法是不可以用的 - 将自己的动态库所在的文件夹赋值给`LD_LIBRARY_PATH`(使用`export`命令)即可执行可执行程序 这个方法在每次打开终端时都是需要操作的(此变量在关闭之后会被清空),这个一般是用于开发过程中使用的 - 永久的方法:配置到`.bashrc`文件中,在文件后使用
    1
    #export LD_LIBRARY_PATH=/绝对路径
    再`source ./.bashrc`即可 - 常用的方法 - 找到动态连接器的配置文件`/etc/ld.so.conf` - `sudo vim /etc/ld/so.conf` - 把动态库的绝对路径写入到这个文件夹 - `sudo ldconfig -v` 就可以了

2.4 优缺点

  • 优点
    • 执行程序体积变小,因为可执行程序不包含库文件
    • 动态库更新了,如果接口不变,则不要重新编译
  • 缺点
    • 发布程序时,需要将动态库提供给客户
    • 动态库加载时比静态库要慢一些
  • © 2019-2022 Wendell
  • Powered by Hexo Theme Ayer

请我喝杯咖啡吧~

支付宝
微信