Linux -- 初识动静态库

目录

为什么要有库?

静态库

什么是静态库?

特点

优点

缺点

动态库

什么是动态库?

优点

缺点

编译器会选择哪个库?


为什么要有库?

库的存在是为了提高软件开发的效率、促进代码复用以及简化维护工作。通过使用库可以有效地屏蔽不同系统之间的差异

静态库

什么是静态库?

静态库(Static Library)是一种在编译时就将库的代码和数据链接到可执行文件中的库。与动态库不同,静态库的内容是在构建最终程序的过程中直接嵌入到应用程序里的。这意味着每个使用该静态库的应用程序都会包含一份完整的库代码副本。在Linux/Unix系统中,静态库一般以.a为扩展名(来自“archive”的缩写)

特点

  • 编译时链接:当编译器生成最终的可执行文件时,它会将静态库中所需的函数和数据复制到可执行文件中。
  • 独立性:一旦应用程序被编译并链接了静态库,那么这个应用程序就可以独立运行,不需要外部库文件的支持。
  • 大小:由于每个使用相同静态库的应用程序都包含了库的一份完整拷贝,这可能导致生成的可执行文件体积较大。
  • 更新不便:如果静态库中的某个函数需要更新或修复,那么所有依赖于该库的应用程序都需要重新编译和链接以获得最新的版本。
  • 性能:因为所有的代码都在一个可执行文件内,所以在某些情况下,静态链接可能提供更好的性能,因为它避免了运行时查找和加载共享库的开销

优点

  • 简单部署:不需要担心目标系统上是否安装了正确的库版本。
  • 一致性:保证了应用使用的库版本不会因外部因素而改变。
  • 可靠性:对于关键任务的应用来说,静态链接可以减少对系统环境的依赖,从而提高稳定性。

缺点

  • 存储空间:多个应用程序如果使用相同的静态库,则会占用更多的磁盘空间,因为每个程序都有自己的库副本。
  • 维护成本:每次库更新都需要重新编译所有依赖它的应用程序。
  • 内存使用:在多进程环境中,如果多个进程都使用相同的静态库,那么这些库的代码会在内存中重复出现,消耗更多内存资源。

 

动态库

什么是动态库?

动态库(Dynamic Library),也被称为共享库(Shared Library),是一种可以在程序运行时加载的代码和数据集合。与静态库不同,动态库在编译时并不直接链接到可执行文件中,而是在程序运行时由操作系统根据需要加载到内存中,并且可以被多个程序同时使用。这种方式减少了磁盘空间的占用,同时也使得库的更新更加方便,因为不需要重新编译所有依赖该库的应用程序。在Linux和类Unix系统中,动态库通常以.so(Shared Object)为扩展名。

优点

  • 节省内存:多个应用程序可以共享同一份库文件的单一实例。
  • 易于升级:如果库文件被修复或升级了,那么所有依赖它的应用程序都可以立即受益,而无需重新编译。
  • 灵活性:可以在程序运行时决定加载哪些库,甚至可以选择性地加载库中的特定功能。

缺点

  • 兼容性问题:如果库进行了不向后兼容的更改,可能会导致依赖它的旧版本程序无法正常工作。
  • 性能影响:由于库是在运行时加载的,因此可能会有一些额外的性能开销。
  • 部署复杂性:需要确保目标系统上存在正确的库版本,并且位于正确的路径下。

编译器会选择哪个库?

  • 如果同时提供动态库和静态库,gcc 默认使用的是动态库,如果非要用静态库,必须使用 static 选项;
  • 如果只提供了静态库,可执行程序只能使用静态链接,但是程序不一定整体是静态链接;
  • 如果只提供了动态库,默认只能动态链接,非得静态链接的话会发生链接错误。 

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

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

相关文章

SpringSecurity(一)——认证实现

一、初步理解 SpringSecurity的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤器。 当前系统中SpringSecurity过滤器链中有哪些过滤器及它们的顺序。 核心过滤器: (认证)UsernamePasswordAuthenticationFilter:负责处理…

js获取硬件设备

在Javascript中通过MediaDevices 的方法enumerateDevices() 请求一个可用的媒体输入和输出设备的列表,例如麦克风,摄像机,耳机设备等。返回的 Promise 完成时,会带有一个描述设备的 MediaDeviceInfo 的数组。通常你可以使用 navig…

python yolov8半自动标注

首先标注一部分图片,进行训练,生成模型,标注文件为xml方便后面统一做处理。 1、标注数据(文件为xml, 转为txt用于训练,保留xml标签文件) 2、模型训练(训练配置、训练代码、) 3、使用…

极狐GitLab 发布安全补丁版本 17.4.1、17.3.4、17.2.8

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…

[已解决]DockerTarBuilder永久解决镜像docker拉取异常问题

前阵子发现阿里云的docker加速镜像失效了(甚至连nginx都拉取不了),重新换了并且加多了网络上比较常用的dokcer加速源,可以解决一部分问题,但仍然有一些镜像的某个版本或一些比较冷的镜像就是拉取不了,原因未…

Multiprocessing出错没有提示was skipped without notice in python

这个问题可以通过打印返回结果解决。 解决方法 比如 Pool.apply_async(csdnKuangXiaoHU, args=(p, DestFile))改成 Result = Pool.apply_async(csdnKuangXiaoHU, args=

『网络游戏』数据库表格转储【25】

避免勿删数据库表格,可以将表格存储 放到桌面即可 现在将表格删除后点击 浏览桌面表格保存即可 修改客户端脚本:NetSvc.cs 目的是在数据库更新异常时弹出提示以便修改 本章结束

进程间通信、无名管道、有名管道

一、进程 1.1 进程间通信的概念 线程通信通过全局变量即可。 进程间通信是相互独立的,但是所有进程都共用一份内核空间,所以进程和进程之间的通信可以通过内核去进行。 1.2 进程间通信方式 共7种: 传统的进程间通信方式: 无名管道有名管道…

suspend、suspendCancellableCoroutine、continuation-kotlin协程

0.首先整理协程的启动方法 在 Kotlin 中,启动协程的方法有多种,常用的方法包括 launch、async、和 runBlocking。每种方法有不同的用途和特性。以下是它们的详细介绍: 1. launch launch 是一个启动新协程的方法,返回一个 Job 对…

uniapp生成随机数

推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…

深入理解C++ STL中的 vector

文章目录 1. vector 的概述1.1 vector 是什么?1.2 vector 的优点1.3 vector 的缺点 2. vector 的基本使用2.1 vector 的定义2.2 基本操作2.3 示例2.4 迭代器的使用 3. vector 的内部实现原理3.1 动态数组的实现3.2 内存管理3.3 内存扩展策略3.4 元素的插入与删除3.4…

VSCode 查看 Git 的历史记录的三种技巧

前言 在我们日常开发工作过程中,可能经常会看到一些离谱的历史代码,或者当项目发生线上事故时,如何快速定位是谁提交的代码导致的? 作为前端开发者,VSCode 是目前最为流行的代码编辑工具,也是日常最常打开…

服务器CUDA版本升级

https://blog.csdn.net/m0_52583356/article/details/138150039 上面这篇文章是按照显卡驱动所支持的最高cuda版本来更新cuda Toolkit的,但是如果你想要更新显卡驱动最高支持的CUDA版本,就需要更新显卡驱动了。 更新显卡驱动需要先卸载原有显卡驱动&am…

Vue中计算属性computed—(详解计算属性vs方法Methods,包括案例+代码)

文章目录 计算属性computed3.1 概述3.2 使用3.3 计算属性vs方法Methods3.4 计算属性的完整写法 计算属性computed 3.1 概述 基于现有的数据,计算出来的新属性。 依赖的数据变化,自动重新计算 语法: 声明在 computed 配置项中,…

OPC UA与PostgreSQL如何实现无缝连接?

随着工业4.0的推进,数据交换和集成在智能制造中扮演着越来越重要的角色。OPC UA能够实现设备与设备、设备与系统之间的高效数据交换。而PostgreSQL则是一种强大的开源关系型数据库管理系统,广泛应用于数据存储和管理。如何将OPC UA与PostgreSQL结合起来&…

python pip安装requirements.txt依赖与国内镜像

python pip安装requirements.txt依赖与国内镜像 如果网络通畅,直接pip安装依赖: pip install -r requirements.txt 如果需要国内的镜像,可以考虑使用阿里的,在后面加上: -i http://mirrors.aliyun.com/pypi/simple --…

基于System.js的微前端实现(插件化)

目录​​​​​​​ 写在前面 一、微前端相关知识 (一)概念 (二) 优势 (三) 缺点 (四)应用场景 (五)现有框架 1. qiankun 2. single-spa 3. SystemJ…

GO之流程控制

一、流程控制简述 一)流程控制的作用 流程控制语句是用来控制程序中语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑块 二)流程控制的分类 控制语句分为三类:顺序、选择和循环 顺序结构:依次执行&#xf…

通过Express + Vue3从零构建一个用户认证与授权系统(二)数据库与后端项目搭建与实现

前言 上一篇完成了系统的相关设计文档的编写,本文将详细介绍如何一步步使用 TypeScript 和 Express 搭建一个模块化、类型安全的用户认证与授权系统,包括数据库设计、后端项目搭建、用户认证、角色与权限管理、错误处理以及 Swagger 文档集成。 项目准…

Label Studio 半自动化标注

引言 Label Studio ML 后端是一个 SDK,用于包装您的机器学习代码并将其转换为 Web 服务器。Web 服务器可以连接到正在运行的 Label Studio 实例,以自动执行标记任务。我们提供了一个示例模型库,您可以在自己的工作流程中使用这些模型,也可以根据需要进行扩展和自定义。 1…