Linux静态库与动态库的生成和使用

静态库与动态库的生成和使用

库文件实际上就是封装了一大堆已经编译完成的代码文件,通过链接这个库进而获取到相应函数实现。

动态库的生成

动态库的打包:
gcc -c -fPIC child.c -o child.o
gcc -shared child.o -o libmychild.so

动态库生成的链接器:gcc

  • -fPIC:生成目标代码时产生位置无关代码,动态库会在虚拟地址空间的共享区中加载一份
  • -share:要生成的是动态库而不是可执行程序

动态库的命名:
lib 是前缀    .so是后缀    中间是库名称
Linux静态库与动态库的生成和使用

静态库的生成

静态库的打包:
gcc -c child.c -o child.o
ar -cr libmychild.a child.o

静态库生成的链接器:ar

  • -c:创建静态库
  • -r:模块替换

静态库的命名:
lib 是前缀    .a 是后缀    中间是库名称
Linux静态库与动态库的生成和使用

库的使用

查看可执行程序(main)依赖的动态库
ldd main

生成可执行程序时链接使用:gcc main.c -o main -lmychild(-l 指定库名称)

  • 必须将库文件放到指定路径下:/usr/lib64
  • 设置链接库的搜索路径环境变量,将当前库文件所在路径添加进去:export LIBRARY_PATH = $LIBRARY_PATH:.
  • 使用gcc -L选项指定链接库的搜索路径:gcc main.c -o main -L./ -lmychild

运行可执行程序时加载使用:仅仅针对动态库才会在运行时加载库文件

  • 必须将库文件放到指定路径下:/usr/lib64
  • 设置链接库的搜索路径环境变量,将当前库文件所在路径添加进去:export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:.

Linux静态库与动态库的生成和使用

如果链接的时候链接的是动态库,程序运行时就需要加载动态库。
如果链接的时候链接的是静态库,程序运行时就不需要加载库文件。

实际工作中使用第三方库,我们通常用 -L 来指定第三方库所在的路径,链接的是静态库。
Linux静态库与动态库的生成和使用

测试代码https://github.com/achen228/Linux/tree/master/base_io/lib