linux静态链接和动态链接

  1. 静态链接的特点
    • 程序独立性高
      • 静态链接是在程序编译时,将所有需要的目标文件以及它们所依赖的库文件中的代码和数据链接成一个可执行文件。一旦链接完成,这个可执行文件就包含了运行所需的全部内容,不依赖外部的库文件。例如,一个简单的 C 语言程序使用了数学库中的函数,在静态链接时,数学库的相关代码会被复制到最终的可执行文件中。这样,在任何环境下运行这个可执行文件,只要操作系统能够识别这个文件格式,它就可以独立运行,不用担心缺少某些库的支持。
    • 执行效率相对稳定
      • 由于所有的代码和数据在程序运行之前就已经整合到了可执行文件中,在运行时不需要进行额外的链接操作。所以在程序启动和运行过程中,系统加载程序的速度相对较快,而且运行过程中的性能不会因为动态链接库的加载和卸载等操作而受到影响。例如,对于一些对实时性要求很高的嵌入式系统程序,静态链接可以保证程序的快速启动和稳定运行。
    • 文件体积较大
      • 因为要把程序运行所需要的所有库代码和数据都包含在可执行文件中,所以可执行文件的大小会比较大。比如一个简单的图形界面程序,如果是静态链接,除了程序自身的代码,还会包含图形库的所有代码,可能会使可执行文件从原本动态链接的几百 KB 增大到几 MB 甚至更大。这对于存储资源有限的设备来说可能是个问题。
    • 更新维护不便
      • 当程序所依赖的库文件更新时,需要重新编译整个程序进行链接。例如,如果程序依赖的一个加密库发现了安全漏洞并进行了修复,即使程序本身的代码没有改变,也需要重新编译链接程序,将新的库代码包含进去,这在大型软件项目中会增加维护成本和更新的复杂性。
  1. 动态链接的特点
    • 节省内存和磁盘空间
      • 动态链接库(DLL - Dynamic - Link Library,在 Linux 下是.so 文件)是在程序运行时才进行加载的。多个程序可以共享同一个动态链接库。例如,在操作系统中,多个应用程序可能都需要使用显示图形的库。这些程序在运行时可以共享系统中的同一个图形显示动态链接库,而不是每个程序都包含一份完整的图形库代码。这样在磁盘上,每个程序的可执行文件体积会变小;在内存中,当多个程序同时运行并使用同一个动态链接库时,内存中也只需要加载一份库的副本,节省了内存空间。
    • 便于更新和维护
      • 当动态链接库更新时,只要接口不变,程序不需要重新编译。例如,操作系统的安全更新可能会更新一些系统的动态链接库来修复安全漏洞。应用程序只要在运行时能够找到新的动态链接库并且接口兼容,就可以直接使用更新后的库功能,而不需要开发者重新编译发布程序。
    • 程序启动相对较慢
      • 因为在程序启动时需要进行动态链接库的加载和链接过程,所以相比于静态链接的程序,动态链接的程序启动速度可能会稍慢。例如,一个动态链接的大型软件,在启动时需要加载多个动态链接库,系统需要查找这些库的位置,进行加载和初始化等操作,这会增加启动的时间开销。
    • 存在依赖风险
      • 动态链接的程序依赖于外部的动态链接库,如果在运行时找不到所需的动态链接库或者库的版本不兼容,程序将无法正常运行。例如,在一些复杂的软件部署环境中,可能因为操作系统版本不同或者库文件的安装路径问题,导致程序在运行时找不到合适的动态链接库,从而出现错误。

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

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

相关文章

Android学习8 -- NDK2--练习2(Opencv)

以下是一个简单的安卓项目示例,通过NDK调用OpenCV来处理图像(例如,将彩色图像转换为灰度图像)。 开发环境 安装 Android Studio(支持NDK开发)。配置NDK和CMake(通过Android Studio的SDK Manage…

Pixtral Large开源:Mistral AI的1240亿参数多模态模型超越GPT-4o等竞争对手

Pixtral Large是什么 Pixtral Large是由法国人工智能初创公司Mistral AI开发的超大多模态模型,拥有1240亿参数,2024年11月18日正式对外发布。它基于Mistral Large 2开发而成,具备1230亿参数的多模态解码器和10亿参数的视觉编码器。这个模型能…

阿里云整理(二)

阿里云整理 1. 访问网站2. 专业名词2.1 域名2.2 域名备案2.3 云解析DNS2.4 CDN2.5 WAF 1. 访问网站 用户使用浏览器访问网站大体分为几个过程: 用户在浏览器输入域名URL,例如www.baidu.com。 不过,浏览器并不知道为该域名提供服务的服务器具…

【联表查询】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

【分布式】分布式缓存

一、什么是分布式缓存 分布式缓存是一种将缓存数据存储在多个节点上的缓存方案。它通过将数据分散存储在多个节点的内存中,以提高系统的读取性能、降低数据库压力和提高系统可扩展性。 二、分布式缓存的优点 优点明细提高性能:分布式缓存可以将数据缓…

创建子类对象时,会创建父类对象吗

一、查询网上的结论: 创建子类对象时, 会先调用子类构造方法对子类对象进行初始化,子类构造方法的第一行又会调用父类构造方法对父类进行初始化(不会创建父类对象, 但是会在子类对象的内存空间中开辟一块被包含的内存空间存储父类…

标贝科技受邀出席2024东湖国际人工智能高峰论坛并入选数据要素合作伙伴名单

近日,备受瞩目的2024东湖国际人工智能高峰论坛在中国光谷科技会展中心隆重召开。会议以“智联世界,共创未来”为主题,省市相关单位、专家学者、产学研各界百余家联合体单位齐聚一堂,共话人工智能领域的最新技术及产业发展趋势。会…

[Python] 进阶之路:模块、包和异常处理

在掌握了Python的类与对象后,下一步是深入理解模块化开发和异常处理。模块与包帮助我们组织代码,增强代码的可维护性和重用性,而异常处理则是编写健壮代码的重要技能。本文将系统讲解Python中模块、包和异常处理的核心概念与实用技巧。 一、模…

使用AI工具Screenshot to Code将UI设计图翻译成代码

一、获取openAI apikey。 一般有两种方式,一种是到openAI官网注册账号,付费申请GPT4的apikey。另一种是某宝买代理。我这里采用第二种。 二、安装Screenshot to Code 1.到github下载源码。 2.启动,两种方式:源码启动和docker启动…

SpringBoot mq快速上手

1.依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 2.示例代码 基础信息配置 package com.example.demo.config;import org.springframework.amqp.co…

Rust学习笔记_07——枚举和范围

Rust学习笔记_04——引用 Rust学习笔记_05——控制流(1) Rust学习笔记_06——控制流(2) 文章目录 1. 枚举1.1基础1.2 给枚举变体起个“别名”1.3 枚举与匹配&#xff08;match&#xff09; 2. 范围2.1 介绍2.2 半开区间范围2.3 包含范围的语法糖2.4 步长范围&#xff08;Range …

VMware Workstation Pro安装教程 (全图文保姆级)

一、前言 系统&#xff1a;Windows 11时间&#xff1a;2024/12/04需求&#xff1a;注册&#xff1a;broadcom&#xff08;邮箱&#xff09;难点&#xff1a;在官网找到下载链接 二、说明 建议前往官网&#xff08;https://www.vmware.com&#xff09;下载&#xff0c;可能加…

前端开发 之 15个页面加载特效下【附完整源码】

文章目录 十二&#xff1a;铜钱3D圆环加载特效1.效果展示2.HTML完整代码 十三&#xff1a;扇形百分比加载特效1.效果展示2.HTML完整代码 十四&#xff1a;四色圆环显现加载特效1.效果展示2.HTML完整代码 十五&#xff1a;跷跷板加载特效1.效果展示2.HTML完整代码 十二&#xff…

protobuf实现Hbase数据压缩

目录 前置HBase数据压缩效果获取数据(反序列化) 前置 安装说明 使用说明 HBaseDDL和DML操作 HBase数据压缩 问题 在上文的datain中原文 每次写入数据会写入4个单元格的内容&#xff0c;现在希望能对其进行筛减&#xff0c;合并成1格&#xff0c;减少存储空间&#xff08;序列…

Svn如何切换删除账号

记录Svn清除切换账号 1.首先打开小乌龟的设置如下图 打开设置后单击已保存数据&#xff0c;然后选择清除 接上图选择清除后&#xff0c;就可以打勾选择清除已保存的账号&#xff0c;我们再次检出的就可以切换账号了 &#x1f449;总结 本次记录Svn清除切换账号 如能帮助到你…

正点原子imx6ull配置MQTT客户端上传数据到Ubuntu MQTT服务器

目录 使用QT自带的MQTT模块部署客户端创建一个class专门用于MQTT客户端通讯使用QT在ui界面上生成按钮在Windows上订阅相应主题测试在imx6ull上订阅Windows发布的消息 在上一篇中介绍了在Ubuntu22.04的Docker中部署MQTT服务器&#xff0c;然后在window上测试订阅和发布&#xff…

Linux的用户和权限【Linux操作系统】

文章目录 Linux的用户切换用户普通用户暂时以root用户的权限执行指令如何把一个普通用户加入白名单? 新建用户 Linux权限权限的组成更改权限文件/目录权限的表示方法&#xff1a; umask粘滞位添加粘滞位的方法 Linux的用户 Linux下有两种⽤⼾&#xff1a;超级用户&#xff08…

clang和gcc的区别

​ 1.Clang采用的license是BSD&#xff0c;而GCC是GPLv3&#xff1b;GCC支持许多语言扩展&#xff0c;其中有些Clang不能实现。 2.GCC&#xff1a;GNU(Gnu’s Not Unix)编译器套装(GNU Compiler Collection&#xff0c;GCC)&#xff0c;指一套编程语言编译器&#xff0c;以GPL…

OpenCV的圆形检测‌HoughCircles

HoughCircles 函数是 OpenCV 库中用于在灰度图像中检测圆的函数,它基于霍夫变换(Hough Transform)的一种变体——梯度霍夫变换(HOUGH_GRADIENT)函数原型如下: void HoughCircles( InputArray image, OutputArray circles,int method, double dp, double minDist,double …

XML 语言随笔

XML的含义 XML&#xff08;eXtensible Markup Language&#xff0c;可扩展标记语言&#xff09;是一种用于存储和传输数据的标记语言。XML与HTML&#xff08;HyperText Markup Language&#xff0c;超文本标记语言&#xff09;类似&#xff0c;但XML的设计目的是描述数据&…