linux 下的静态库与动态库

news2024/12/23 12:20:41

目录

一、介绍

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.coloradmin.cn/o/2173013.html

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

相关文章

vue启动报错

vue执行npm run dev报错如下 Error: error:0308010C:digital envelope routines::unsupportedat new Hash (node:internal/crypto/hash:69:19)at Object.createHash (node:crypto:133:10)at module.exports (F:\ray\taisheng-erp-frontend-master\node_modules\webpack\lib\ut…

深信服2025届全球校招研发笔试-C卷(AK)

前面14个填空题 T1 已知 子数组 定义为原数组中的一个连续子序列。现给定一个正整数数组 arr,请计算该数组内所有可能的奇数长度子数组的数值之和。 输入描述 输入一个正整数数组arr 输出描述 所有可能的奇数长度子数组的和 示例 1 输入 1,4,2,5,3 输出 58 说明 …

[论文精读]Polarized Graph Neural Networks

论文网址:Polarized Graph Neural Networks | Proceedings of the ACM Web Conference 2022 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于…

Junit 5 - 理解Mockito,提高UT 覆盖率

前言 当我是1个3年初级程序员时, 我被面试者问到1个问题: 如何保证你的开发任务交付质量 当我是1个7年开发组长时, 我被面试者问到另1个问题:如何保证你的团队的代码质量, 减少rework。 又若干年后, 我才…

代码随想录Day 58|拓扑排序、dijkstra算法精讲,题目:软件构建、参加科学大会

提示:DDU,供自己复习使用。欢迎大家前来讨论~ 文章目录 图论part08**拓扑排序精讲**题目:117. 软件构建拓扑排序的背景解题思路:模拟过程 **dijkstra(朴素版)精讲**题目:47. 参加科学大会解题思…

leetcode每日一题day14(24.9.24)——字符串最多的子序列

思路:对于应该首要和贡献联系起来,对于什么是贡献呢,即在某种情况下,会贡献出多少种,符合要求的结果,此题属于较为基础的,对于text中的一个字符如果是非pattern中的元素,则对结果无任何影响&…

舒舒活动图片 小暑至,暑气湿气缠身怎么办?中医教你消暑宁心,健脾祛湿

小暑标志着酷夏的到来,闷热潮湿的气候令人不适,仿佛暑湿交织笼罩全身。众多友人诉苦不已,此般环境致使心绪不宁、身躯疲惫,失措寻对策。实则无需忧虑,持之以恒地进行消暑养心、健脾除湿,便能安然度夏。 暑气…

Vue 技术入门 day1 模版语法、数据绑定、事件处理、计算属性与监视、class和style绑定、条件渲染v-if/v-show、列表渲染v-for

目录 1.Vue 核心 1.1. Vue 简介 1.1.1 介绍与描述 1.1.2 Vue 的特点 1.2 模板语法 1.2.1 模板的分类 1.2.2 插值语法 1.2.3 指令语法 1.2.4 实例 1.3 数据绑定 1.3.1 单向数据绑定 1.3.2 双向数据绑定 1.3.3 MVVM 模型 1.3.4 data与el的2种写法 1.3.5 实例 1.3.…

【C++前缀和】2731. 移动机器人|1922

本文涉及的基础知识点 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode2731. 移动机器人 有一些机器人分布在一条无限长的数轴上,他们初始坐标用一个下标从 0 开始的整数数组 nums 表示。当你给机器人下达命令时&…

manim中实现文字换行和设置字体格式

实现换行 from manim import * class Textline(Scene): def construct(self): self.camera.background_color "#2F4F14" # 创建中心文本 horizontal_line Line(startLEFT * 8, endRIGHT * 8, colorWHITE).shift(3 * UP) stext Text("线性代数", …

0. Pixel3 在Ubuntu22下Android12源码拉取 + 编译

0. Pixel3 在Ubuntu22下Android12源码拉取 编译 原文地址: http://www.androidcrack.com/index.php/archives/3/ 1. 前言 这是一个非常悲伤的故事, 因为一个意外, 不小心把之前镜像的源码搞坏了. 也没做版本管理,恢复不了了. 那么只能说是重新做一次. 再者以前的镜像太老旧…

828华为云征文|部署去中心化网络的 AI 照片管理应用 PhotoPrism

828华为云征文|部署去中心化网络的 AI 照片管理应用 PhotoPrism 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 PhotoPrism3.1 PhotoPrism 介绍3.2 PhotoPrism…

OpenHarmony标准系统上实现对rk系列芯片NPU的支持(驱动移植)

1.将RKNPU驱动移植到Openharmony内核 本文以rk3568为例,将RKNPU驱动移植到Openharmony使用的kernel 5.10中 开发环境 DAYU200 rk3568开发板OpenHarmony 4.1 Release 64位系统 文档约定:4.1r_3568为OpenHarmony标准系统源码根目录 1.0 环境准备 1.搭建O…

Windows11 + Ubuntu 24.10

我在win11安装Ubuntu主板:华硕主板Z790 DARK HERO,进入安装,所以文章中bios系统设置为华硕的bios系统。 一、确认系统信息-BIOS为UEFL 备注:UEFL优于MBR,具体可以查询问ai。如果BIOS模式中不是UEFL,建议为UEFL 1、 win+R 输入 msinfo32,打开系统信息,可以看到…

printf详解

printf("hello \nworld\n"):将hello word打印到屏幕上,在使用printf函数时可以多次使用换行符\n,想在哪里加都可以 int main() {printf("hello \nworld\n");return 0; } 占位符:在printf中,占位…

delphi制作漂亮的农历窗体(IntraWeb+Layui的完美结合)

delphi制作漂亮的农历窗体(IntraWebLayui的完美结合) 不需要安装服务器,Apache和IIS都不需要,自带企业级服务器。 运行exe服务器就架好了,直接打开手机浏览器或者电脑浏览器,网页就出来了,如果…

AI驱动TDSQL-C Serverless 数据库技术实战营-颠覆传统分析模式:智能体与TDSQL-C结合实现人才的可视化数据分析

文章目录 前言云数据库的对比传统云数据库:TDSQL-C Serverless: 智能体与TDSQL-C的结合思路 算力服务器与数据库服务器申请与部署购买 TDSQL-C Mysql Serverless 实例购买HAI高算力服务器 准备工作准备数据下载依赖 案例开发创建数据库开启智能体与TDSQL-C结合 总结…

智能新宠:BabyAlpha A2开启家庭机器人新时代

具身智能领域的“疯狂”,已经迈入了全新的阶段!让我们一起来看看这段视频:一个人形机器人在前面奔跑,一群机器狗紧随其后;接着是人追赶机器狗,随后机器狗又追逐人……视频最后,那个机器人似乎还…

【Python】Daphne:Django 异步服务的桥梁

Daphne 是 Django Channels 项目的一部分,专门用于为 Django 提供支持 HTTP、WebSocket、HTTP2 和 ASGI 协议的异步服务器。Daphne 是一个开源的 Python 异步服务器,它可以帮助开发者运行异步应用程序,并且非常适合与 Django Channels 一起使…

回家啦回家啦

耒阳也有茶颜月色了,没忍住喝了一杯! 衡阳卤粉,想出来的味道👅,一般般 但一个粉店能做到24小时不打烊,应该也还行哈 银行竟然支持扫脸取钱了!!