当前位置: 首页 > backend >正文

Linux系统中的静态库和动态库

目录

Linux系统中的静态库和动态库

一、静态库

1、静态库的制作

①、源程序编写

②、编译源码

③、创建静态库

2、使用静态库

①、编写主程序

②、编译主程序并链接静态库

③、执行

④、结果

二、动态库

1、动态库的制作

①、源程序编写

②、编译源代码为位置无关代码(PIC)

③、创建动态库

2、使用动态库

①、编写主程序

②、编译主程序并链接动态库

③、运行程序

三、静态库和动态库的区别

1、加载时机

2、可执行文件大小

3、更新和维护


Linux系统中的静态库和动态库

一、静态库

1、静态库的制作

①、源程序编写

add.c

int add(int a, int b)
{return a + b;
}

sub.c

int sub(int a, int b)
{return a - b;
}
②、编译源码

使用 gcc 编译器将源代码编译成对象文件(.o 文件)

gcc -c add.c -o add.o
gcc -c sub.c -o sub.o

③、创建静态库

使用 ar 工具将对象文件打包成一个静态库。

ar -rcs libmylib.a add.o sub.o

ar 参数:

        c 禁止在创建库时产生的正常消息

        r 如果指定的文件已经存在于库中,则替换它

        s 无论 ar 命令是否修改了库内容都强制重新生成库符号表

        v 将建立新库的详细的逐个文件的描述写至标准输出

        q 将指定的文件添加到库的末尾

        t 将库的目录写至标准输出

2、使用静态库

①、编写主程序
#include <stdio.h>
​
extern int add(int a, int b);
extern int sub(int a, int b);
​
int main(int argc, const char *argv[])
{int a = 5;int b = 3;printf("a + b = %d\n", add(a, b));printf("a - b = %d\n", sub(a, b));
​return 0;
}
②、编译主程序并链接静态库
gcc main.c -L. -lmylib -o main
  • -L. 表示指定当前目录作为库文件的搜索路径。

  • -lmylib 表示链接名为 libmylib.a 的静态库(注意 -l 后面的库名不带 lib 前缀和 .a 后缀)。

  • -o main 指定输出的可执行文件名为 main。

③、执行
./main
④、结果

二、动态库

1、动态库的制作

①、源程序编写

add.c

int add(int a, int b)
{return a + b;
}

sub.c

int sub(int a, int b)
{return a - b;
}
②、编译源代码为位置无关代码(PIC)
gcc -fPIC -c add.c -o add.o
gcc -fPIC -c sub.c -o sub.o

-fPIC 选项表示生成位置无关代码,这是动态库的要求之一。

③、创建动态库
gcc -shared -o libmylib.so add.o sub.o
  • -shared 表示生成共享库(动态库)。

  • -o libmylib.so 指定输出的动态库文件名为 libmylib.so,动态库通常以 .so 结尾。

2、使用动态库

①、编写主程序
#include <stdio.h>
​
extern int add(int a, int b);
extern int sub(int a, int b);
​
int main(int argc, const char *argv[])
{int a = 5;int b = 3;printf("a + b = %d\n", add(a, b));printf("a - b = %d\n", sub(a, b));
​return 0;
}
②、编译主程序并链接动态库
gcc main.c -L. -lmylib -o main

和静态库链接时的命令类似,但这里链接的是动态库。

③、运行程序

  • 在运行程序之前,需要确保动态库能够被找到。可以将动态库所在的目录添加到 LD_LIBRARY_PATH 环境变量中,或者将动态库拷贝到标准的库目录(如 /usr/lib),或者添加/etc/ld.so.conf.d/*.conf文件,执行ldconfig刷新

  • 设置 LD_LIBRARY_PATH 的命令如下:

    export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

三、静态库和动态库的区别

1、加载时机
  • 静态库是在程序编译链接阶段被加载到可执行文件中,生成的可执行文件包含了静态库的代码。

  • 而动态库是在程序运行时加载的,可执行文件中不包含动态库的代码,只是在运行时通过动态链接器从动态库中获取所需的代码。

2、可执行文件大小
  • 使用静态库时,可执行文件会比较大,因为它包含了静态库的代码。

  • 使用动态库时,可执行文件相对较小,因为动态库的代码是共享的,多个程序可以同时使用同一个动态库。

3、更新和维护
  • 如果更新了静态库,需要重新编译链接使用该静态库的程序。

  • 而动态库更新后,只要不破坏原有接口,使用该动态库的程序不需要重新编译链接,只要重新启动即可使用新的动态库版本。  

参考资源:https://download.csdn.net/download/2403_82436914/90713276

http://www.xdnf.cn/news/2886.html

相关文章:

  • 《无刷空心杯电机减速机选型及行业发展趋势》
  • 解密面试高频题:加权轮询负载均衡算法 (Java 实现)
  • 量子算法调试:Grover算法搜索空间压缩过程可视化方案
  • 算法笔记.kruskal算法求最小生成树
  • 汤晓鸥:计算机视觉的开拓者与AI产业化的先行者
  • 深入理解 Spring 类型转换核心接口 ConversionService
  • emqx部署
  • 厚铜板的镀前处理差异:工艺参数与成本影响
  • C22-作业练习之最大公约数与最小公倍数
  • idea启动springboot方式及web调用
  • 半监督学习与强化学习的结合:新兴的智能训练模式
  • Docker网络架构深度解析与技术实践
  • 【深入理解指针(6)】
  • IIC 通信协议
  • Spring系列四:AOP切面编程第三部分
  • MySQL-排序
  • Finish技术生态计划: FinishRpc
  • print用法讲解(Python)
  • 数字人接大模型第二步:语音克隆
  • 洛谷P1003[NOIP 2011 提高组] 铺地毯
  • GPU虚拟化实现(四)
  • XMOS人工智能降噪——AI降噪让极端嘈杂环境下的通话和拾音变得可能
  • 说说stack reconciler 和fiber reconciler
  • 算法题(136):逛画展
  • 如何利用谷歌趋势精确估算关键词搜索量?
  • DDI0487--A1.3
  • 阿里云服务器云盘扩容
  • 【Machine Learning Q and AI 读书笔记】- 01 嵌入、潜空间和表征
  • 更新日期自动填充
  • LeetCode 热题 100_最小路径和(92_64_中等_C++)(多维动态规划)