1. 各自优缺点
静态库:在程序执行之前(编译)已经加入到目标程序中。
优点:1. 打包到应用程序中加载速度快。
2. 发布程序无需提供静态库,其原因为静态库已经在app中,移植方便。
缺点:1. 链接时完整的拷贝到可执行文件中,被多次使用就有多份冗余拷贝。
2. 更新、部署、发布麻烦。
动态库:在程序运行时动态(临时)由目标程序去调用
优点:1. 链接时不用复制,程序运行时由系统动态加载到内存中供程序调用,系统只加载一次, 多个程序可以共同使用,节省内存。
2. 程序升级简单,因为app里面没有库的源代码,升级滞后只要库不改变名字,函数名以及参数不改变,只是做了优化,就能加载成功。
缺点: 1. 加载速度比静态库慢。
2. 发布程序需要提供依赖的动态库。
2. 静态库的制作与使用
制作:库的最终格式 name(库的名称).a
1. 生成name.o文件。
指令: gcc name.c -c
eg: gcc addFunc.c -c
2. name.o文件生成静态库文件 name.a
指令:ar rcs libname.a name.o
eg: ar rcs libaddFunc.a addFunc.o
使用:
指令: gcc mainFunc.c -laddFunc -L ./ -o mainProStatic
对其做出解释: -laddFunc -l是指定要用的库,库名砍头去尾。
-L 告诉gcc编译器从-L指定的路径去找静态库。默认是从 /usr/lib /usr/local/lib去找。
./ 代表当前路径。
-o 表示产生目标文件。
笔者给出文件名称截图:
动态库的制作与使用
制作:库的最终名称为 name.so
1. 将文件生成.o文件。
指令 gcc -shared -fpic addFunc.c -o -libaddFunc.so
-shared 指定生成动态库。
-fpic 标准。fpic选项作用于编译阶段,在生成目标文件时就使用该选项以生成位置无关的代码。
使用:gcc mainFunc.c -laddFunc -L ./ -o mainProDynamic
当直接运行mainProDynamic时,无法运行成功,其错误提示为:
因为动态库是在程序运行时去找库,此时找不到
将动态库libaddFunc.os放入user lib 指令为: sudo cp libaddFunc.so /usr/lib/
指令学习
pwd 当前工作路径