linux 下的静态库与动态库

目录

一、介绍

1、静态库

2、动态库

二、操作

1、静态库

2、动态库

3、使用库文件

(1)方法一

(2)方法二

(3)方法三


一、介绍

1、静态库

        静态链接库实现链接操作的方式很简单,即程序文件中哪里用到了库文件中的功能模块,GCC 编译器就会将该模板代码直接复制到程序文件的适当位置,最终生成可执行文件。

        使用静态链接库生成的文件通常体积较大,但运行时不再依赖库文件,可以拷贝到别的设备上运行。

        在Linux中静态链接库文件的后缀名通常用 .a 表示;在Windows系统中,静态链接库文件的后缀名为 .lib。

2、动态库

        动态链接库,又称为共享链接库。和静态链接库不同,采用动态链接库实现链接操作时,程序文件中哪里需要库文件的功能模块,GCC 编译器不会直接将该功能模块的代码拷贝到文件中,而是将功能模块的位置信息记录到文件中,直接生成可执行文件。

        使用动态链接库生成的文件通常体积较小,但运行时依赖库文件

        在Linux中,动态链接库的后缀名通常用 .so 表示;在Windows系统中,动态链接库的后缀名为 .dll。

二、操作

1、静态库

        通常情况下GCC在编译过程中默认使用动态链接库,我们可以使用 -static 选项指定使用静态链接库。

        需要注意,库名格式为:libxxx.a

ar rcs 静态链接库名称 目标文件1 目标文件2 ...
# demo
gcc -c demo1.c -o demo1.o
gcc -c demo2.c -o demo2.o
# 生成静态库 demo.a 
ar rcs demo.a demo1.o demo2.i

2、动态库

        可将不包含 main 函数的一个或多个文件打包为动态库文件。

        需要注意,库名格式为:libxxx.so

# 若出错,可以将 -fpic 换位 -fPIC
gcc -fpic -shared 源文件名... -o 动态链接库名

3、使用库文件

        在Linux 中,库文件的搜索路径除了默认的搜索路径外(/lib 或 /lib64 或者 /usr/lib),还可通过三种方法来指定:

(1)方法一

        linux 主机下 /etc/ld.so.conf 配置文件中指定库文件搜索路径为:include ld.so.conf.d/*.conf

        我们可以在 /etc/ld.so.conf.d 文件夹下创建后缀为 conf 的配置文件,并将需要搜索的库文件路径添加进去。

        添加完后需要使用 ldconfig 刷新缓存。

        下面以 mariadb-x86_64.conf 为例,如下图所示:

(2)方法二

        通过环境变量 LD_LIBRARY_PATH 指定库文件搜索路径(临时的,只在当前shell下生效);

# 获取当前路径(绝对路径)
SHELL_FOLDER=$(cd "$(dirname "$0")";pwd)
# 添加依赖搜索路径(当前路径下的 lib/linux_64 目录)
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${SHELL_FOLDER}/lib/linux_x64

(3)方法三

       在编译目标代码时指定该程序的库文件搜索路径。

       使用 gcc 或 g++ 时可以使用 -rpath 在生成的可执行文件中设置运行时库搜索路径,告知动态链接器在哪些目录下查找库文件。

       需要注意与 -L 参数进行区分:-L 参数只影响链接器在链接过程中查找库文件的路径,而 -rpath 参数影响动态链接器在程序运行时查找库文件的路径。

g++ -Wl,-rpath=/usr/local/lib/ -oevh libevent_http.cpp -levent

--------------------------------------------------------------

--------------------------------------------------------------

                  GPT生成的废话,混分用

--------------------------------------------------------------

--------------------------------------------------------------

动态库(Dynamic Link Library,简称DLL,在Linux/Unix系统中通常以.so后缀)与静态库(Static Library,在Unix-like系统中通常以.a后缀,Windows上则为.lib,但通常用于导入库)是程序开发中用于代码重用和模块化的两种重要方式。它们各自具有独特的特点和用法,下面将详细介绍两者之间的区别和联系。

动态库

定义与特点

  • 动态库是一个包含可由多个程序同时使用的代码和数据的库。这些代码和数据在程序运行时被加载到内存中,供程序调用。
  • 动态库允许不同的程序共享同一份库文件,从而节省磁盘空间和内存。
  • 由于动态库的内容不会直接包含在可执行文件中,因此使用动态库的程序在运行时需要能够找到并加载库文件。

编译与链接

  • 在编译阶段,编译器会为程序生成对动态库中函数的引用,而不是将函数的实际代码复制到可执行文件中。
  • 在链接阶段,链接器会处理这些引用,并生成一个包含必要信息的可执行文件,以便在运行时由动态链接器(如Windows上的Loader.exe或Linux上的ld.so)加载动态库。

运行时行为

  • 当程序运行时,动态链接器会查找并加载所需的动态库文件到内存中。
  • 程序通过动态链接器提供的接口调用动态库中的函数。
  • 如果动态库文件不存在或版本不兼容,程序可能无法正常运行。

优点与缺点

  • 优点:节省磁盘空间和内存(因为多个程序可以共享同一份库文件);便于更新和维护(只需更新库文件即可影响所有使用该库的程序)。
  • 缺点:存在依赖问题(程序需要找到并加载库文件才能运行);在某些情况下可能导致性能下降(因为存在额外的加载和解析时间)。

静态库

定义与特点

  • 静态库是在编译时将库中的代码和数据直接复制到可执行文件中的库。
  • 一旦静态库被链接到程序中,程序就可以在没有静态库文件的情况下独立运行。

编译与链接

  • 在编译阶段,程序员会编写源代码并生成对象文件(.o或.obj文件)。
  • 在链接阶段,链接器会将这些对象文件以及静态库中的代码和数据合并成一个可执行文件。

运行时行为

  • 由于静态库的内容已经被直接包含在可执行文件中,因此使用静态库的程序在运行时不需要再加载库文件。

优点与缺点

  • 优点:程序可以独立运行(不需要库文件);避免了动态链接的依赖问题。
  • 缺点:导致可执行文件体积增大(因为包含了静态库的全部内容);如果多个程序都使用了相同的静态库,则会造成代码冗余和磁盘空间的浪费;不利于库的更新和维护(因为需要重新编译和链接所有使用该库的程序)。

总结

动态库和静态库各有优缺点,选择哪种库取决于具体的应用场景和需求。在需要节省磁盘空间和内存、便于更新和维护的场景下,动态库是更好的选择;而在需要程序独立运行、避免依赖问题的场景下,静态库则更为合适。在实际开发中,可以根据项目的具体需求灵活选择使用动态库还是静态库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/149300.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【2024W38】肖恩技术周刊(第 16 期):白嫖AI的最佳时段

周刊内容: 对一周内阅读的资讯或技术内容精品(个人向)进行总结,分类大致包含“业界资讯”、“技术博客”、“开源项目”和“工具分享”等。为减少阅读负担提高记忆留存率,每类下内容数一般不超过3条。 更新时间: 星期天 历史收录:…

同等学力申硕英语网课如何选择

很多考生想知道同等学力申硕英语网课如何选择,小编告诉大家,首先明确自己的学习目标和需求是为了提高口语、阅读、写作还是听力能力? 只有明确了自己的学习目标和需求,才能更好地选择适合自己的课程和平台。 二、选择知名品牌和口碑良好的平…

怎么一键更换PPT模板?2个做PPT必备的办公神器推荐!

在主打快节奏的当下,一份精美的PPT演示文稿往往能够为你赢得更多的关注和机会。但不可否认的是,制作一份高质量的PPT并非易事,特别是当你需要频繁更换PPT模板以应对不同场合时,根本抽不出时间来逐一修改。 本文将为大家介绍2款强…

什么是上层封禁海外流量

上层封禁海外流量(Upper-layer Blocking of Overseas Traffic)是一种网络安全策略,旨在通过在网络传输的上层进行流量控制和过滤,从而阻止来自海外的恶意流量或不必要的访问。这一措施主要用于防止分布式拒绝服务(DDoS…

多线程——“死锁”

目录 前言 一、一个线程,一把锁 1.问题介绍 2.可重入锁 二、两个线程,两把锁 1.问题介绍 2.解决方式 三、N个线程,M把锁 1.哲学家就餐问题 2.解决方式 结尾 前言 “死锁”是多线程代码中一类常见的问题,加锁是能解决线…

java算法OJ(1)位运算

目录 1.前言 2.正文 2.1位运算符号 2.1俩数相除 2.1.1题目 2.1.2示例 2.1.3题解 2.2二进制求和 2.2.1题目 2.2.2示例 2.2.3题解 2.3只出现一次的数字 2.3.1题目 2.3.2示例 2.3.3题解 2.4只出现一次的数字(进阶版) 2.4.1题目 2.4.2示例…

怎么在Proteus中找到排阻

1、打开安装好的Proteus,点击上方菜单栏中的“库”,再选择“从库选取零件”,或者在左侧元件列表中单击鼠标右键,再点击右键菜单中的“从库中挑选”选项。 2、之后会打开元器件库,我们打开类别中的“Resistors”&#x…

方法部分 学习

方法是程序中最小的执行单元 方法的定义调用 public static void 方法名(){ 方法体 } 写在main方法外面,在main函数里面直接调用带参数:public static void 方法名(int num1 , int num2&am…

付费计量应用过程(Payment Metering Application process)

The Payment Metering Application process is the combination of the business and support processes as the resultant interactions between the business and support functions, which thus describes the dynamic behavior of the system as a whole. 付费计量…

postman中使用Pre-request Script

一、get方法 get请求时 ,有多个params,并且有一个参数为sign,这个参数是有其他params拼接之后md5加密得到的,如何通过js语句获取params参数并生成sign。 const CryptoJS require(crypto-js); // 引入 CryptoJS 库进行 MD5 加密…

深度学习(5):逻辑斯蒂回归Logistic

文章目录 一、逻辑斯蒂回归(Logistic Regression)二、KL 散度(相对熵)三、交叉熵(Cross-Entropy)四、关系五、总结 一、逻辑斯蒂回归(Logistic Regression) 概述 逻辑斯蒂回归是一种…

MiniCPM-V 2.6训练时fuse_adam报错

原本pip install deepspeed安装了0.15.1版本的,但是在进行sft训练的时候还是报错。大概就是fuse_adam这个op编译有错,c版本要大于17什么的,一堆错。看了一堆解决方案尝试后发现如下这样的有用: 1.下载DeepSpeend源码 git clone ht…

《机器学习》周志华-CH8(集成学习)

8.1个体与集成 集成学习(ensemble learning)通过构建并结合多个学习器来完成学习任务,有时也被称为多分类器系统,基于委员会的学习。 同质”集成“:只包含同种类型的个体学习器,同质集成中的个体学习器亦称“基学习器”&#xff0…

WebRTC关键技术及应用场景:EasyCVR视频汇聚平台高效低延迟视频监控解决方案

众所周知,WebRTC是一项开源的实时通信技术,它通过集成音频、视频和数据传输到Web浏览器中,使得实时通信变得简单且无需任何插件或第三方软件。WebRTC不仅是一个API,也是一系列关键技术和协议的集合,它的出现改变了传统…

中断合并参数coalesce_params解释

在网络驱动程序中,中断是指网络设备向处理器发送信号,通知它有数据需要处理。频繁的中断会导致处理器负担过重,从而影响系统性能。为了优化性能,驱动程序可以使用中断合并技术,将多个中断合并为一个,从而减…

docker快速部署zabbix

两台主机 一台作为server 一台作为agent 安装好docker 并保证服务正常运行,镜像正常pull 分析: 部署 Zabbix 容器环境,通常会涉及几个主要组件: MySQL(或 MariaDB 数据库)、Zabbix Server 和 Zabbix Web I…

【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台

一、介绍 果蔬识别系统,本系统使用Python作为主要开发语言,通过收集了12种常见的水果和蔬菜(‘土豆’, ‘圣女果’, ‘大白菜’, ‘大葱’, ‘梨’, ‘胡萝卜’, ‘芒果’, ‘苹果’, ‘西红柿’, ‘韭菜’, ‘香蕉’, ‘黄瓜’)…

Redis的一些数据类型(一)

(一)数据类型 我们说redis是key value键值对的方式存储数据,key是字符串,而value是一些数据结构,那今天就来说一下value存储的数据。 我们数据结构包含,String,hash,list,set和zest但…

macOS与Ubuntu虚拟机使用SSH文件互传

1.ubuntu配置: 安装openssh服务: sudo apt-get install openssh-server -y 查看服务启动状态: systemctl status ssh 2.macOS使用scp连接ubuntu并发送文件 查看ubuntu IP : ifconfigmacOS终端连接ubuntu : sc

第五篇:Linux进程的相关知识总结(1)

目录 第四章:进程 4.1进程管理 4.1.1进程管理需要的学习目标 4.1.1.1了解进程的相关信息 4.1.1.2僵尸进程的概念和处理方法: 4.1.1.3PID、PPID的概念以及特性: 4.1.1.4进程状态 4.1.2进程管理PS 4.1.2.1静态查看进程 4.1.2.1.1自定义…