使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。
程序函数库可分为3种类型:静态函数库(static libraries)、共享函数库(shared libraries)、动态加载函数库(dynamically loaded libraries)。
1、静态函数库,是在程序执行前就加入到目标程序中去了 ;
优点:运行快,发布的时候无需提供静态库,以为已经在app中了,移植方便。
缺点:程序大,链接时完整地拷贝到可执行文件中,被多次使用就有了多份冗余拷贝。更新、部署、发布麻烦
2、动态函数库同共享函数库是一个东西(在linux上叫共享对象库, 文件后缀是.so ,windows上叫动态加载函数库, 文件后缀是.dll)
优点:灵活,程序小。链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序可以共用,节省内存。程序升级较为简单,因为app内没有库的源码,升级之后只要库的名字不变,函数名以及参数不变,只是实现做了优化,就可以加载成功。
缺点:加载速度比静态库慢,发布程序需要提供依赖的动态库。
命名规则
静态库文件的命名方式是"libxxxx.a",库名以 .a 结尾,前面加上lib, xxx自己取。
制作步骤
1、源代码 .c 或者 .cpp
2、将 .c 文件生成 .o 文件,使用
gcc xxx.c xxx.o -c
3、将 .o 文件打包,生成 .a 文件, 使用命令
ar rcs libxxx.a xxxx1.o xxxx2.o
(这里xxx.o也被称为原材料,就是说你使用xxxx.o这份原材料打包出一个静态库)
4、使用库,
gcc main.c -lxxxx
但直接使用会出现错误,因为使用 -l 会优先去系统找
我们应该加上 -L ,表示先到指定路径去找 (默认是从/usr/lib /usr/local/lib去找), -o表示生成执行文件
gcc main.c -lxxxx -L ./ -o xxx
命名规则
动态库文件的命名方式是"libxxxx.so",库名以 .so 结尾,前面加上lib, xxx自己取,与静态库的命名差不多。
制作步骤
1、将源文件.c 生成 .so文件 ,需要加一个参数 fpic
这里可能会出现一些错误,建议第一、二步连起来。
2、加上 -shared,生成 .so文件 ,
-shared 指定生成共享动态库
-fpic 表明使用地址无关代码。PIC:Position Independent Code
gcc -shared -fpic 功能文件.c -o libxxxx.so
3、使用,例子如下
gcc jisuan.c -lfuns -L ./ -o jisuan
但这里也会出现某些错误,显示打不开动态库或者找不到。这里需要把生成的动态库文件libxxxx.so移到 /usr/lib/libxxxx.so,因为程序会默认到这里来找,另外一个方法就是配置环境变量,但这只对于当前shell有用; 还有就是更改配置信息。
1、到 /etc/ld.so.conf.d添加自己动态库文件的所在路径,但貌似没什么作用。
后来找到了失败的原因,没有刷新缓存.
ldconfig
2、配置环境变量,但只对于当前shell起作用,可以使用脚本完成。
首先编写shell脚本
export LD_LIBRARY_PATH="/xx/xx/xxx/" 此处为动态库所在的路径 ./xxxx 此处xxx表示你生成的执行文件
写好脚本后,使用命令为脚本添加执行权限
chmod +x start.sh