Linux:动态库和静态库
静态库与动态库
A:静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。
B:动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
C:一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。
D:在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)。
E:动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。
举个例子:
测试程序add.hint add(int a, int b);add.c#include "add.h"
int add(int a, int b)
{return a + b;
}sub.hint sub(int a, int b);sub.c#include "add.h"
int sub(int a, int b)
{return a - b;
}main.c
#include <stdio.h>
#include "add.h"
#include "sub.h"
int main(void)
{int a = 10;int b = 20;printf("add(%d,%d)=%d\n", a, b, add(a, b));a = 100;b = 20;printf("sub(%d,%d)=%d\n", a, b, sub(a, b));
}
生成静态库

生成静态库:
ar是gnu归档工具,rc表示(replace and create)
查看静态库中的目录列表:

t:列出静态库中的文件,v:verbose 详细信息

-L 指定库路径 ,-l 指定库名
测试目标文件生成后,静态库删掉,程序照样可以运行!
库搜索路径
A:从左到右搜索-L指定的目录。
B:由环境变量指定的目录 (LIBRARY_PATH)
C:由系统指定的目
a:/usr/lib
b:/usr/local/lib
生成动态库
A:shared: 表示生成共享库格式
B:fPIC:产生位置无关码(position independent code)
C:库名规则:libxxx.so

为什么要先:gcc -fPIC -c sub.c add.c ?
-
编译源代码:
gcc是 GNU 编译器集合,用于编译 C 或 C++ 源代码文件(.c文件)。 -
生成对象文件:
-c选项告诉gcc编译源文件但不要进行链接。编译后生成的目标文件(也称为对象文件)扩展名为.o,例如sub.o和add.o。 -
位置无关代码(Position Independent Code, PIC):
-fPIC选项指示gcc生成位置无关代码。这是创建共享库(shared libraries)所必需的,因为共享库的代码在内存中的位置可能会在不同的程序中变化,而它需要能够在这些不同位置正常工作。 -
准备共享库:生成的对象文件(
.o文件)是准备创建共享库的中间步骤。共享库在运行时被动态加载到内存中,并且可以在多个进程之间共享。 -
避免重复编译:如果源代码没有变化,使用
-fPIC编译生成的对象文件可以被重用,无需重新编译源代码,这可以加快编译过程。 -
模块化:将不同的功能模块编译成单独的对象文件,可以提高模块化和可维护性。如果只需要更新或重新编译一个模块,不需要重新编译整个程序。
-
优化和错误检查:编译每个文件为单独的对象文件允许编译器对每个模块进行优化,并且在编译过程中可以单独检查每个模块的错误。
-
兼容性:使用
-fPIC选项可以确保编译出的对象文件既可以用于生成共享库,也可以用于生成静态库或直接链接到可执行文件中。
总结来说,gcc -fPIC -c sub.c add.c 命令的目的是将 sub.c 和 add.c 这两个源文件编译成位置无关的对象文件,为下一步生成共享库或静态库做准备。这样做可以提高代码的可重用性、模块化和编译效率。
使用动态库
编译选项
l:链接动态库,只要库名即可(去掉lib以及版本号)
L:链接库所在的路径
运行动态库
1、拷贝.so文件到系统共享库路径下, 一般指/usr/lib
2、更改 LD_LIBRARY_PATH

LD_LIBRARY_PATH 是一个在类 Unix 系统中使用的环境变量,它对动态链接器的行为有直接影响。
定义:
LD_LIBRARY_PATH 用于在运行时指定动态链接器搜索共享库(如 .so 文件)的路径。这个环境变量可以包含一个或多个以冒号(:)分隔的目录路径。
工作原理:
当一个程序启动时,如果它依赖于动态链接的共享库,动态链接器(通常是 ld.so 或 ld-linux.so)将负责加载这些库。动态链接器会按照以下顺序搜索库:
- 程序的 rpath(如果存在):这是编译时嵌入到程序可执行文件中的库搜索路径。
LD_LIBRARY_PATH环境变量:如果程序没有 rpath 或者 rpath 中没有找到所需的库,动态链接器会接着在LD_LIBRARY_PATH指定的路径中搜索。- 系统的默认库路径:如果以上两个步骤都没有找到库,动态链接器会最后在系统的标准库路径(如
/lib,/usr/lib,/lib64,/usr/lib64等)中搜索。
3、ldconfig 配置/etc/ld.so.conf.d/,ldconfig更新
ldconfig会读取/etc/ld.so.conf文件以及/etc/ld.so.conf.d/目录下的所有配置文件,这些文件定义了动态链接器搜索共享库的路径。- 根据这些配置文件,
ldconfig会搜索指定的目录,查找共享库文件(通常是.so文件),并更新/etc/ld.so.cache文件。
http://t.csdnimg.cn/FY6pr
http://t.csdnimg.cn/FY6pr
[root@localhost linux]# cat /etc/ld.so.conf.d/bit.conf/root/tools/linux[root@localhost linux]# ldconfig


动态库与静态库的区别
静态链接:
静态库在编译期间将库中的代码加载到程序里,加载成功后,后续与库无关。(编译成库后,把库删掉也能用)。
动态链接:
动态库是运行时加载的,运行时要找到动态库的位置(操作系统知道),加载并运行(运行的过程中不能离开库本身)。
静态库优缺点:
优点:运行速度较快,运行时无需动态链接。
缺点:占用内存大,不同的进程要使用静态库,都要拷贝一份。维护成本高,静态库一旦更新,程序也要随之再编译一次。
动态库优缺点:
优点:占用内存小,多进程之间可以共享资源。维护成本较低,更新是只需要重新加载动态库即可。
缺点:运行时相对于静态库来说较慢(因为要通过指定的路径找到动态库)。
相关文章:
Linux:动态库和静态库
静态库与动态库 A:静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。 B:动态库(.so):程序在运行的时候才去链接动态库的代码&#…...
8.13网络编程
笔记 多点通信 一、套接字属性 套接字属性的获取和设置 #include <sys/types.h> /* See NOTES */#include <sys/socket.h>int getsockopt(int sockfd, int level, int optname,void *optval, socklen_t *optlen);int setsockopt(int sockfd, int level…...
蚂蚁AL1 15.6T 创新科技的新典范
● 哈希率:算力达到15.6T(相当于15600G),即每秒能够进行15.6万亿次哈希计算,在同类产品中算力较为出色,能提高WA掘效率。 ● 功耗:功耗为3510W,虽然数值看似不低,但结合其…...
2024年【汽车驾驶员(技师)】考试报名及汽车驾驶员(技师)试题及解析
题库来源:安全生产模拟考试一点通公众号小程序 汽车驾驶员(技师)考试报名参考答案及汽车驾驶员(技师)考试试题解析是安全生产模拟考试一点通题库老师及汽车驾驶员(技师)操作证已考过的学员汇总…...
2024年【甘肃省安全员C证】报名考试及甘肃省安全员C证考试总结
题库来源:安全生产模拟考试一点通公众号小程序 甘肃省安全员C证报名考试参考答案及甘肃省安全员C证考试试题解析是安全生产模拟考试一点通题库老师及甘肃省安全员C证操作证已考过的学员汇总,相对有效帮助甘肃省安全员C证考试总结学员顺利通过考试。 1、…...
RabbitMQ 双机系统偶尔丢失消息问题排查
实话说起来,这个问题,实际是一个非常低级的错误导致的,算不得什么高深的技术问题。但是在排查的过程中,却是费了好大的功夫,死了不少脑细胞。所以也值得记录一下,算作给大家提个醒,或许可以帮大…...
Python 环境搭建指南 超详细
Python是由荷兰⼈吉多范罗苏姆(Guido von Rossum,后⾯都称呼他为Guido)发明的⼀种编程语言 1. 1989年圣诞节:Guido开始写Python语⾔的编译器。2. 1991年2⽉:第⼀个Python解释器诞⽣,它是⽤C语⾔实现的&…...
使用三菱PLC源码进行PLC读取写入操作
安装 MX Component 。 我的安装地址在: 打开 utl 文件夹下的 Communication Settings Utility 执行。 配置PLC 添加当前需要配置的PLC 注意 logical station Namber 就是程序里需要对接的逻辑站点编号 5.配置选择对应的COM操作选择对应的cpu型型号,…...
使用Nvm切换nodeJs高版本之后,使用npm install一闪而过
先说现象,最近又有几个项目接手,其中有一个使用NVM切换至高版本node后,出现如下症状; 没有任何提示,然后翻看文件目录,node_modules目录没有创建,同时在全局 npm config set prefix 设置的目录下 多了一个 pgn的快捷,指向项目目录。 使用百度或者chart-gtp,搜索到的答案…...
【Kubernetes】k8s集群安全机制
目录 一.认证 1.k8s集群内的三种认证方式 2.k8s集群内的认证说明 2.1.需要被认证的访问类型 2.2.安全性说明 2.3.证书颁发的方式 2.4.kubeconfig 2.5.Service Account 2.6.Secret 与 SA 的关系 二.鉴权 1.鉴权的方式 2.RBAC的角色与角色绑定 2.1.RBAC的角色 2.2…...
嵌入式学习---DAY24:进程--二
一、exec函数族----启动一个新程序 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支), 子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的 用户空间代码和数据完全被…...
Diffusion Model相关论文解析之(二)DENOISING DIFFUSION IMPLICIT MODELS
目录 1、摘要2、创新点3、主要公式4、自己的理解,对错不确定 1、摘要 Denoising Diffusion Implicit Models (DDIM)是一种扩散模型的改进版本,旨在加速采样过程并提高采样速度。DDIM通过引入非马尔可夫扩散过程,相对于传统的去噪扩散概率…...
【STM32嵌入式系统设计与开发拓展】——14_定时器之输入捕获
参考哔站:链接: 铁头山羊 一、微控制器的高级定时与控制功能集合 1、时基单元 2、输入捕获 3、输出比较 4、从模式控制器 5、高级定时器的输出控制 二、问题集合 1、什么是定时器 定时器是一种专门负责定时功能的片上外设GPI0AFI0EXTIUSART RCC I2C) 2、定时器…...
docker swarm如何让两个副本分别跑在两台不同的主机上
虽然 docker swarm 支持自动扩容部署,但是为了服务的稳定性、可靠性,有的时候甲方巴巴会要求一定要服务分散部署在不同的服务器上。 使用默认的部署方式,虽然副本为 N,但是部署的 N 个服务可能落在同一台服务器上。 在 Docker Swa…...
GPT助手的训练流程四个主要阶段( GPT Assistant training pipeline )
GPT助手的训练流程四个主要阶段( GPT Assistant training pipeline ) flyfish 四个阶段 预训练(pre-training) 监督微调(supervised fine tuning, SFT) 奖励建模(reward modeling)…...
网络如何发送一个数据包
网络如何发送一个数据包 网络消息发送就是点一点屏幕。 骚瑞,这一点都不好笑。(小品就是我的本质惹) 之前我就是会被这个问题搞的不安宁。是怎么知道对方的IP地址的呢?怎么知道对方的MAC呢?世界上计算机有那么多&…...
【Harmony OS 4.0】向上滑动加载案例
// 自定义class类对象类型 class Article {public id: numberpublic title: stringpublic content: stringconstructor(id: number, title: string, content: string) {this.id idthis.title titlethis.content content} }// 子组件 Component struct ArticleComponent {Pro…...
SQL基础教程(八)SQL高级处理
※食用指南:文章内容为《SQL基础教程》系列学习笔记,该书对新手入门非常友好,循序渐进,浅显易懂,本人主要用来补全学习MySQL中未涉及的部分,便于刷题和做项目。 官方电子书:《SQL基础教程》第2…...
[论文笔记] Data-Juicer: A One-Stop Data Processing System for Large Language Models
https://arxiv.org/pdf/2309.02033 GitHub - modelscope/data-juicer: A one-stop data processing system to make data higher-quality, juicier, and more digestible for (multimodal) LLMs! 🍎 🍋 🌽 ➡️ ➡️🍸 🍹 🍷为大模型提供更高质量、更丰富、更易”…...
期末速成复习资料——操作系统
体型:选择20判断10填空10*2简答4*5计算2*10 第一章 在一个计算机系统中,通常都含有多种硬件和软件资源。归纳起来可将这些资源分为四类:处理机、存储器、I/O设备以及文件(数据和程序)。相应地,OS的主要功能…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
边缘计算网关提升水产养殖尾水处理的远程运维效率
一、项目背景 随着水产养殖行业的快速发展,养殖尾水的处理成为了一个亟待解决的环保问题。传统的尾水处理方式不仅效率低下,而且难以实现精准监控和管理。为了提升尾水处理的效果和效率,同时降低人力成本,某大型水产养殖企业决定…...
【java面试】微服务篇
【java面试】微服务篇 一、总体框架二、Springcloud(一)Springcloud五大组件(二)服务注册和发现1、Eureka2、Nacos (三)负载均衡1、Ribbon负载均衡流程2、Ribbon负载均衡策略3、自定义负载均衡策略4、总结 …...
raid存储技术
1. 存储技术概念 数据存储架构是对数据存储方式、存储设备及相关组件的组织和规划,涵盖存储系统的布局、数据存储策略等,它明确数据如何存储、管理与访问,为数据的安全、高效使用提供支撑。 由计算机中一组存储设备、控制部件和管理信息调度的…...
【QT控件】显示类控件
目录 一、Label 二、LCD Number 三、ProgressBar 四、Calendar Widget QT专栏:QT_uyeonashi的博客-CSDN博客 一、Label QLabel 可以用来显示文本和图片. 核心属性如下 代码示例: 显示不同格式的文本 1) 在界面上创建三个 QLabel 尺寸放大一些. objectName 分别…...
Yolo11改进策略:Block改进|FCM,特征互补映射模块|AAAI 2025|即插即用
1 论文信息 FBRT-YOLO(Faster and Better for Real-Time Aerial Image Detection)是由北京理工大学团队提出的专用于航拍图像实时目标检测的创新框架,发表于AAAI 2025。论文针对航拍场景中小目标检测的核心难题展开研究,重点解决…...
