Linux静态库与动态库的生成和使用
静态库与动态库的生成和使用
库文件实际上就是封装了一大堆已经编译完成的代码文件,通过链接这个库进而获取到相应函数实现。
动态库的生成
动态库的打包:gcc -c -fPIC child.c -o child.o
gcc -shared child.o -o libmychild.so
动态库生成的链接器:gcc
- -fPIC:生成目标代码时产生位置无关代码,动态库会在虚拟地址空间的共享区中加载一份
- -share:要生成的是动态库而不是可执行程序
动态库的命名:
lib 是前缀 .so是后缀 中间是库名称
静态库的生成
静态库的打包:gcc -c child.c -o child.o
ar -cr libmychild.a child.o
静态库生成的链接器:ar
- -c:创建静态库
- -r:模块替换
静态库的命名:
lib 是前缀 .a 是后缀 中间是库名称
库的使用
查看可执行程序(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:.
如果链接的时候链接的是动态库,程序运行时就需要加载动态库。
如果链接的时候链接的是静态库,程序运行时就不需要加载库文件。
实际工作中使用第三方库,我们通常用 -L 来指定第三方库所在的路径,链接的是静态库。