使用GNU的工具我们如何在Linux下创建自己的程序函数库
静态库1
静态函数库:
是在程序执行前(编译)就加入到目标程序中去了
优点:2
-
运行快,静态库被打包到应用程序中加载速度快
-
发布程序无需提供静态库,因为已经在app中,移植方便
缺点:
- 程序很大
- 链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝
- 更新、部署、发布麻烦
动态库
是在程序执行时,动态(临时)由目标程序去调用
优点:
- 程序很小,且简洁
- 链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序可以共用,节省内存
- 程序升级简单,因为app里面没有库的源代码,升级之后只要库的名字不变,函数名以及参数不变,只是实现做了优化,就能加载成功
缺点:
- 运行慢,加载速度比静态库慢
- 发布程序需要提供依赖的动态库
库的制作
静态库的制作:格式xxxx.a
- gcc calcufuncs.c -c 生成xxx.o文件
- ar rcs libcalcufunc.a calcufuncs.o xxx.o文件生成xxx.a静态库文件
动态库的制作:
- gcc -shared -fpic calcufuncs.c -o libcalc.so
- -shared 指定生成动态库
- -fpic 通用标准,fPIC 选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码
Linux中命名系统中共享库的规则:
库的使用
静态库:
- gcc calculatorT.c -lcalcufunc -L ./ -o mainProStatic
- -lcalcufunc
- libcalcufunc.a 库文件
- -l是制定要用的动态库,库名砍头去尾
- -L告诉gcc编译器从-L制定的路径去找静态库
- 默认是从/usr/lib,/usr/local/lib去找
动态库:
- gcc calculatorT.c -lcalc -L ./ -o mainProDy
- libcalc.so 动态库编译时也是要砍头去尾
引用动态库:3
- 带动态库的程序,可以指定该程序运行时候,在LD_LIBRARY_PATH 所指定的路径去找库文件
- 通过环境变量LD_LIBRARY_PATH指定动态库搜索路径
可生成一个ssh脚本
vi test.sh
export LD_LIBRARY_PATH="xxx/ccc/test"
./mainProDy
chmod +x test.sh 给test.sh脚本可执行权限