- 库文件是计算机上的一类文件,可以简单的把库文件看成一种代码仓库,它提供使用者可以直接拿来用的变量、函数或类。
- 库是一种特殊的程序,编写库的程序和编写一般的程序区别不大,只是库不能单独运行。
- 库文件有两种,静态库和动态库(共享库),区别是:静态库在程序的链接阶段被复制到了程序中;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。
- 库的好处:1、代码保密 2、方便部署和分发
2.1 命名规则与制作规则
如图所示是一个实现加减乘除运算的代码,用来制作一个静态库。
gcc -c add.c div.c mult.c sub.c//gcc -c 进行编译生成.o文件
ar rcs libcalc.a add.o sub.o mul//生成静态库
2.2 静态库的使用
如下图所示,这是我们一个实现加减乘除的项目文件夹。其中lib文件夹下的libcalc.a文件是生成的库文件。在静态库使用的时候,头文件必须放到项目里面。不要以为生成了静态库,就不用头文件了,因为我们生成的库仍然需要头文件。
其中main函数为
//main.c
#include
#include
int main()
{
int a = 20;
int b = 12;
printf("a = %d, b = %d\n", a, b);
printf("a + b = %d\n", add(a, b));
printf("a - b = %d\n", subtract(a, b));
printf("a * b = %d\n", multiply(a, b));
printf("a / b = %f\n", divide(a, b));
return 0;
}
执行命令编译main函数
gcc main.c -o app -I ./include/ -l calc -L ./lib
-I 的所有是指定main函数在include文件夹下搜索头文件,-L 指定main函数在lib下找库。
运行结果如下图所示
由main函数可知我们没有调用src文件夹下的实现加减乘除的源码,我们删除src文件夹仍然可以运行,这样可以保护我们的源码不被别人知道,实现代码保密。
3.1 命名规则与制作规则
制作流程:
gcc -c -fpic add.c div.c sub.c mult.c//生成位置无关的代码
如下图所示
gcc -shared add.o sub.o mult.o div.o -o libcalc.so//生成动态库
如下图所示
3.2 动态库使用
把上一步的libcalc.so复制到项目的lib文件夹中
gcc main.c -o app -I ./include/ -l calc -L ./lib //使用动态库编译main函数
运行app的时候出现错误
./app: error while loading shared libraries: libcalc.so: cannot open shared object file: No such file or directory
解决这个问题先了解一下动态库原理,我们在3.3解决。
3.3 静态库与动态库原理
◼静态库:GCC 进行链接时,会把静态库中代码打包到可执行程序中。
◼动态库:GCC 进行链接时,动态库的代码不会被打包到可执行程序中。
◼程序启动之后,动态库会被动态加载到内存中,通过ldd(list dynamic dependencies)命令检查动态库依赖关系。
ldd命令查找app依赖发现库未找到
◼如何定位共享库文件呢?当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径。此时就需要系统的动态载入器来获取该绝对路径。对于elf格式的可执行程序,是由ld-linux.so来完成的,它先后搜索elf文件的DT_RPATH段——> 环境变量LD_LIBRARY_PATH ——> /etc/ld.so.cache文件列表——> /lib/,/usr/lib目录找到库文件后将其载入内存。如果查找不到就会报错。
解决办法是添加动态库的环境变量:
1、在shell中临时配置环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/gao/lesson/lesson5.1/library/lib
/home/gao/lesson/lesson5.1/library/lib为库所在的绝对路径
下图说明配置成功
临时配置在我们重新打开shell后,临时配置将失效。
2、两种方法永久配置环境变量
方法1:用户级配置
在用户家目录下,用vim .bashrc
命令打开用户目录下的 .bashrc,添加环境变量。如下图所示。
再运行source .bashrc
使配置生效。如下图所示配置生效。
方法二:
在root文件夹下,使用root用户在etc文件夹中的profile文件里添加环境变量。
使用./etc/profile
指令使配置生效。
如下图所示已解决上述问题。
当然我们还有其他方法配置库环境变量,例如修改/etc/ld.so.cache文件,也可以把库文件放到/lib/,/usr/lib两个文件夹里。
动态库和静态库都是在链接阶段进行的处理,称为动态链接方式和静态链接方式。静态链接方式是把静态库代码放入可执行文件中,在运行的时候可执行文件包含了静态库代码。动态链接只是把一些链接信息放到可执行文件中,在运行的时候需要依靠环境变量找到库文件。此外制作制作过程也不一样。
静态库优缺点:
动态库优缺点:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)