概述
本质上来说,库文件就是可执行代码的二进制形式,可以被操作系统载入内存中执行。
Linux操作系统支持的函数库分为静态库和动态库,动态库又称共享库。
Linux系统有几个重要的目录存放相应的函数库,如/lib、/usr/lib。
注意
静态库
编译(链接)时把静态库中相关代码复制到可执行文件中。
特点
1、程序中已包含代码,运行时不再需要静态库。
2、程序运行时无需加载,运行速度更快。
3、需要占用更多的磁盘和内存空间。
4、静态库升级后,程序需要重新编译链接。
动态库
又名共享库,编译(链接)时仅仅记录用到哪个共享库中的哪个符号,不复制共享库中的相关代码。
特点
1、程序不包含库中代码,尺寸小。
2、多个程序可共享同一个库。
3、程序运行时需要加载库。
4、库升级方便,无需重新编译程序。
5、使用更加广泛。
另外,小编所有文章均是自己亲手编写验证,由于文件太多,小编就不在公众号后台一一回复列举了,若需要小编的工程代码,请关注公众号,后台回复需要的工程文件。小编看到后会第一时间回复。
操作
静态库
确定库中的函数的功能及接口
编写库源码
编译生成目标文件:cc -c opr.c -Wall
创建静态库:ar crs libopr.a opr.o
注意:linux生成静态库文件名称必须以lib开始.a结尾
检查库,查看库中符号信息:nm libopr.a
编写应用程序,调用库
编译应用程序并链接静态库:gcc -o main main.c -L. -lopr
注意:-L告诉编译器库的路径,-l后面指定库的名称。
编译器默认链接C库,如果库本身就放在C库下,就不需要指定路径,否则必须指定路径。
运行应用程序:./main
动态库
确定库汇总函数的功能、接口
编写库源码
编译生成目标文件:gcc -c -fPIC opr.c -Wall
注意:-fPIC告诉编译器生成位置无关代码。
编译生成共享库:gcc -shared -o libopr.so.1 opr.o
注意:共享库命名规则:以lib开始,.so结尾,后面可加上数字表示共享库不同版本号。
为共享库创建符号链接:ln -s libopr.so.1 libopr.so
注意:符号链接名称后面不能跟版本号
编写应用程序。
编译应用程序并链接共享库:gcc -o main main.c -L. -lopr
注意:跟链接静态库一样,对于gcc来说,编译器首先寻找共享库,如果共享库找不到再链接静态库,若想直接找静态库可以加-static选项。
添加共享库的加载路径,并执行应用程序。
方法一:通过修改环境变量。export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
注意:方法一只对当前sheel有效(临时有效,最简单)。
方法二:将库拷贝到/usr/lib和lib目录下(不太建议)。
方法三:将库路径加入配置文件中
步骤一:新建配置*.conf文件:sudo vi /etc/ld.so.conf.d/feng.conf
步骤二:输入库文件所在目录路径:/home/feng/feng/library/dynamic
步骤三:执行ldconfig刷新:sudo ldconfig。
步骤四:运行应用程序。
示例
★包含演示程序库文件源码opr.c、头文件opr.h以及应用程序main.c(已验证通过)。
opr.h
/** * @Filename : opr.h * @Revision : $Revision: 1.00 $ * @Author : Feng(更多编程相关的知识和源码见微信公众号:不只会拍照的程序猿,欢迎订阅) * @Description : linux库测试 **/ #ifndef __OPR_H__ #define __OPR_H__ /** * 加法处理 * @ a,b操作数 * 返回结果 */ int add(int a, int b); /** * 减法处理 * @ a,b操作数 * 返回结果 */ int sub(int a, int b); /** * 乘法处理 * @ a,b操作数 * 返回结果 */ int mul(int a, int b); #endif
opr.c
/** * @Filename : opr.c * @Revision : $Revision: 1.00 $ * @Author : Feng(更多编程相关的知识和源码见微信公众号:不只会拍照的程序猿,欢迎订阅) * @Description : linux库测试 **/ #include "opr.h" /** * 加法处理 * @ a,b操作数 * 返回结果 */ int add(int a, int b) { return (a + b); } /** * 减法处理 * @ a,b操作数 * 返回结果 */ int sub(int a, int b) { return (a - b); } /** * 乘法处理 * @ a,b操作数 * 返回结果 */ int mul(int a, int b) { return (a * b); }
main.c
/** * @Filename : main.c * @Revision : $Revision: 1.00 $ * @Author : Feng(更多编程相关的知识和源码见微信公众号:不只会拍照的程序猿,欢迎订阅) * @Description : linux库测试,应用程序 **/ #include "opr.h" #include <stdio.h> int main(void) { int a=10, b=2; printf("%d + %d = %d\n", a, b, add(a, b)); printf("%d - %d = %d\n", a, b, sub(a, b)); printf("%d * %d = %d\n", a, b, mul(a, b)); return 0;
往期 · 推荐