五一也要学习:Linux 静态库与动态库的制作常用知识点总结(如何保密你的代码)

五一也要学习:Linux 静态库与动态库的制作常用知识点总结(如何保密你的代码),第1张

静态库与动态库的制作学习总结 1 什么是库
  • 库文件是计算机上的一类文件,可以简单的把库文件看成一种代码仓库,它提供使用者可以直接拿来用的变量、函数或类。
  • 库是一种特殊的程序,编写库的程序和编写一般的程序区别不大,只是库不能单独运行。
  • 库文件有两种,静态库和动态库(共享库),区别是:静态库在程序的链接阶段被复制到了程序中;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。
  • 库的好处:1、代码保密 2、方便部署和分发
2 静态库制作

2.1 命名规则与制作规则

如图所示是一个实现加减乘除运算的代码,用来制作一个静态库。

  1. gcc -c add.c div.c mult.c sub.c//gcc -c 进行编译生成.o文件
  2. 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 动态库的制作和使用

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两个文件夹里。

4 静态库与动态库对比

动态库和静态库都是在链接阶段进行的处理,称为动态链接方式和静态链接方式。静态链接方式是把静态库代码放入可执行文件中,在运行的时候可执行文件包含了静态库代码。动态链接只是把一些链接信息放到可执行文件中,在运行的时候需要依靠环境变量找到库文件。此外制作制作过程也不一样。
静态库优缺点:
动态库优缺点:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/793857.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存