Linux之静态库和动态库的制作
静态库
1、静态库的命名规则:
(1)、lib+库的名字+.a
(2)、libmytest.a 库的名字 红色标记部分为库的名字,左右两边为 静态库的标准格式
2、制作步骤:
(1)、生成对应的.o文件 ==============》 .c ---------------> .o -c
gcc -c *.c -I../include
(2)、将生成的.o文件打包 ar rcs + 静态库的名字( libMyTest.a ) + 生成的所有 .o
ar rcs libMyCalc.a *.o
3、使用和发布静态库:
(1)、发布静态库
(2)、头文件也一起发布给用户
4、生成可执行程序的方法:
(1)、第一种方法:
gcc main.c lib/MyCalc.a -I include -o clac
(2)、第二种方法(比较常见):
gcc main.c -Iinclude -L./ib -l MyCalc -o mycalc
注: -L 指的是我们要调用的库的目录 -l 指的是库的名字,掐头去尾,去掉 .lib 和后缀的 .a
5、打包 *,o 的工具:
ar rcs libMyCalc.a *.o
6、静态库的优缺点:
(1)、优点:
(a)、发布程序的时候不需要提供相应的库
(b)、加载库的速度快相对于动态库快
(2)、缺点:
(a)、库被打包到应用程序中,导致库的体积很大
(b)、库发生了改变,需要重新编译
7、静态库的工作示意图:
共享库(动态链接库)
1、命名规则:
lib + 名字 + .so
2、制作步骤:
(1)、生成与位置无关代码(生成与位置无关的 .o 文件)
gcc -fPIC -c *.c -I../include
(2)、将 .o 打包成共享库(动态库)------------> 打报工具 : gcc
gcc -shared -o libMyCalc_share.so *.o -I../include
3、发布和使用共享库:
(1)、生成与位置无关的 *.o 文件
gcc -fPIC -c *.c -I../include
(2)、打包
gcc -shared -o libMyCalc_share.so *.o -I../include
(3)、使用动态库
(a)、第一种方法: gcc main.c lib/libMyCalc_share.so -I./include -o app
(b)、这种方法程序会报错:gcc main.c -I./include -Llib -lMyCalc_share -o myapp
(4)、ldd 查看可执行程序运行时,所依赖的共享库
(5)、动态链接器
4、解决程序执行时动态库无法加载的问题:
(1)、放到系统的库目录中 --------------------- 不允许使用
sudo cp ./lib/libMyCalc_share.so /lib
(2)、临时测试(建议使用)
(a)、环境变量: LD_LIBRARY_PATH = 将动态库的路径设置给该变量
LD_LIBRARY_PATH=/home/arrayli/day03/dynamic/lib
(b)、将设置的值导入到系统的环境变量中
export LD_LIBRARY_PATH=/home/arrayli/day03/dynamic/lib
注:当前终端关闭后,设置会失效
(3)、不常用的方法(永久设置)
(a)、在家目录的 .bashrc文件中添加一句话:
export LD_LIBRARY_PATH=/home/arrayli/day03/dynamic/lib
(b)、.bashrc修改完成,需要重启终端
(4)、必须掌握这种方法
(a)、需要找到动态链接器的配置文件 ------------------- /etc/ld.so.conf
(b)、动态库的路径写到配置文件中 -------------------- 绝对路径
(c)、更新 ------------------- sudo ldconfig -v
5、动态库的优缺点:
(1)、优点:
(a)、执行程序的体积很小
(b)、动态库有了更新,不需要重新编译程序(函数接口不变)
(2)、缺点:
(a)、发布程序的时候,需要将动态库提供给用户
(b)、动态库没有被打包到应用程序中,加载速度相对静态库较慢
小结:
小编在这里使用文字叙述和代码图片的详细步骤,介绍Linux环境里面静态库和动态库的制作和使用。由于小编水平有限,在本博客中有不足或者欠缺的地方
欢迎各位大佬前来指导 。