当前位置: 首页 > news >正文

找到一个linux静态库动态库的好资料.2

# 正文

继续整理从这个页面学到的东西:https://tldp.org/HOWTO/Program-Library-HOWTO
这一篇主要参考这俩:
https://tldp.org/HOWTO/Program-Library-HOWTO/introduction.html
https://tldp.org/HOWTO/Program-Library-HOWTO/static-libraries.html

这个资料主要讨论“库”,即program library。那什么叫“库”?就是一个包含了已编译代码的、可以被其它程序包含的文件。原文曰:A ``program library'' is simply a file containing compiled code (and data) that is to be incorporated later into a program。“库”有三种,静态库、共享库、动态库,对应的原文是static libraries,shared libraries,and dynamically loaded (DL) libraries。我还没能查到这三个词在中文资料里的规范叫法是什么,也不想查,因为感觉“静态库”、“共享库”、“动态库”已经足够清晰了,所以下文就用这三个说法了,加不加双引号反正都是这三个意思。为何要强调这一点呢,因为发现若干网文并不严格区分“共享库”与“动态库”,经常索性一个“动态库”了事,这很让人困惑的,我还专门问过文心一言(尾注1)。。算了不吐槽了,因为我自己写的也强不多点,唯一让我自我感觉良好一点的,就是我总会贴出来原始资料链接。

静态库是编译可执行文件时就被包含进去了的;共享库是程序启动时就加载;动态库是程序运行时、执行到需要库函数时候才加载。严格来说,“动态库”的库文件格式没有什么不同,因为静态库和共享库的库文件都可以作为动态库使用;不同的只限于编程时对库文件的用法。使用动态库时,编程要麻烦一些,而且,若干程序完全不需要动态库的优点;使用静态库时,一旦库升级了,就得重新编译可执行程序;当然,它们还是各有优势。

原文作者提醒了这个事情:共享库在有的地方被叫做 dynamically linked libraries,缩写也是DLL,我想这大概是中文资料里经常只说“静态库”和“动态库”的原因,想来美国人阅读某些资料可能也是和我们有一样的困惑:中文里动态库有“共享”和“动态”两个意思,英文的DLL也是如此这般,好吧,我心理平衡了一点儿。

静态库就是一个对象文件的集合,一般以.a结尾,使用ar命令创建。
静态库早于共享库出现,现在不如之前那么使用广泛了,但有时也用。
静态库有个好处就是,制作成静态库的这一部分代码可以不用总是重新编译,这样可以节省编译时间;不过现在的编译器速度都很快,所以这个优势就不那么明显了。
还有个好处就是,可以让别的用户使用库文件却无需提供源码,这对付费软件发布者很方便,但对使用者不太方便。
理论上,使用静态库比使用共享库或动态库快一点(1%-5%),但现实中这点差异无足轻重。

想把目标文件file1.o和file2.o打包成静态库mylib.a,使用命令ar rcs mylib.a file1.o file2.o就可以了。使用静态库的简单示例在找到一个linux静态库动态库的好资料.1里有一个,不再说了。原作者这里单独强调了一个事情,就是gcc的-l选项要放到要编译的文件后边,原文是:the -l option is a linker option, and thus needs to be placed AFTER the name of the file to be compiled),不过,文章是2003年4月写的,现在GCC(1)的man page上-l选项也没说这个,看来这已经成为历史了。
GCC(1)的man page上对-l选项的说明

要不说一下上边的那个ar(1)命令吧,因为之前项目上编静态库都是只使用rc选项,看一眼都是啥意思。它有manual page:

看来就是个类似tar的打包工具,只是常用来打包库文件。它可以使用s选项给创建的库文件加索引,链接到有索引的库文件时速度更快;有了索引,库里面的例程还可以相互调用:


c就是create归档文件的意思,和tar的-c类似:

r选项就是把.o对象文件加入到归档文件的意思:

好了就这些吧,其实原文也没说多少,呶:

# 尾注

尾注1

相关文章:

找到一个linux静态库动态库的好资料.2

# 正文 继续整理从这个页面学到的东西:https://tldp.org/HOWTO/Program-Library-HOWTO 这一篇主要参考这俩: https://tldp.org/HOWTO/Program-Library-HOWTO/introduction.html https://tldp.org/HOWTO/Program-Library-HOWTO/static-libraries.html 这…...

存储块的原理与创建

目录 问题概述 malloc和free 固定块大小分配 设计原理 设计实现 为RTOS提供内存管理与回收机制 问题概述 malloc和free extern void *malloc(unsigned int num_bytes); //malloc向系统申请分配指定size个字节的内存空间。 //返回类型是void *类型 extern void free(void *ptr);…...

RabbitMQ工作模式(详解 工作模式:简单队列、工作队列、公平分发以及消息应答和消息持久化)

文章目录 十.RabbitMQ10.1 简单队列实现10.2 Work 模式(工作队列)10.3 公平分发10.4 RabbitMQ 消息应答与消息持久化消息应答概念配置 消息持久化概念配置 十.RabbitMQ 10.1 简单队列实现 简单队列通常指的是一个基本的消息队列,它可以用于…...

电脑提示报错NetLoad.dll文件丢失或损坏?是什么原因?

一、NetLoad.dll文件丢失或损坏的根源 程序安装不完整:某些程序在安装过程中可能因为磁盘错误、网络中断或安装程序本身的缺陷,导致NetLoad.dll文件未能正确安装或复制。 恶意软件攻击:病毒、木马等恶意软件可能会篡改或删除系统文件&#x…...

【物联网技术与应用】实验15:电位器传感器实验

实验15 电位器传感器实验 【实验介绍】 电位器可以帮助控制Arduino板上的LED闪烁的时间间隔。 【实验组件】 ● Arduino Uno主板* 1 ● 电位器模块* 1 ● USB电缆*1 ● 面包板* 1 ● 9V方型电池* 1 ● 跳线若干 【实验原理】 模拟电位器是模拟电子元件,模…...

WPF 绘制过顶点的圆滑曲线(样条,贝塞尔)

项目中要用到样条曲线,必须过顶点,圆滑后还不能太走样,捣鼓一番,发现里面颇有玄机,于是把我多方抄来改造的方法发出来,方便新手: 如上图,看代码吧: -------------------…...

YOLOv9-0.1部分代码阅读笔记-assigner.py

assigner.py utils\tal\assigner.py 目录 assigner.py 1.所需的库和模块 2.def select_candidates_in_gts(xy_centers, gt_bboxes, eps1e-9): 3.def select_highest_overlaps(mask_pos, overlaps, n_max_boxes): 4.class TaskAlignedAssigner(nn.Module): 1.所需的库…...

mybatis-plus自动填充时间的配置类实现

mybatis-plus自动填充时间的配置类实现 在实际操作过程中,我们并不希望创建时间、修改时间这些来手动进行,而是希望通过自动化来完成,而mybatis-plus则也提供了自动填充功能来实现这一操作,接下来,就来了解一下mybatis…...

fgets TAILQ_INSERT_TAIL

If you’re using the macros from <sys/queue.h> to implement a circular doubly linked list (TAILQ), the inversion issue occurs because you’re using LIST_INSERT_HEAD, which inserts at the head of the list. Instead, to maintain the original order (FIFO…...

upload-labs关卡记录12

直接上传一句话木马&#xff0c;发现提示&#xff1a; 很明显这是一个白名单&#xff0c;而且不是前端的js检查&#xff0c;而是服务端的检查&#xff0c;因此我们使用bp抓包&#xff0c;改一下文件类型试试&#xff1a; 找到包之后&#xff0c;我们对content-type进行一个更改…...

服务器被攻击怎么办

当服务器遭受恶意流量攻击&#xff0c;如DDoS&#xff08;分布式拒绝服务&#xff09;或CC&#xff08;Challenge Collapsar&#xff09;攻击时&#xff0c;传统的防护措施可能不足以应对。此时&#xff0c;采用高防IP服务可以有效缓解攻击压力&#xff0c;确保业务连续性和数据…...

Node.js 助力前端开发:自动化操作实战

前端开发中&#xff0c;重复性任务如新建文件、配置路由、生成组件等&#xff0c;往往耗时且容易出错。借助 Node.js 的强大能力&#xff0c;我们可以实现开发过程中的自动化操作&#xff0c;提高效率。 文章目录 自动生成 router 配置文件自动生成组件模板动态构建导航菜单自…...

MATLAB符号计算-符号表达式基础运算操作

1.1.2符号变量取值域的限定 默认复数域 【例1-1-2】解不等式 1.1.3创建符号表达式 对符号对象进行各种运算&#xff08;算术运算、关系运算、逻辑运算&#xff09;&#xff0c;即可创建符号表达式。 1.算术运算与转置 【例1-1-3】 f5是f4的共轭转置 f6是f4的转置 2.关系…...

ADB 上传文件并使用脚本监控上传百分比

有个需求&#xff0c;需要测试 emmc的外部连续写入性能&#xff0c;使用 ADB 上传一个巨大的文件。并且在上传到一定值时进行干预。 因此但是 adb push 命令本身会 block 运行并且不返回进度&#xff0c;因此需要一个额外的监控脚本。 上传脚本&#xff1a; echo off setloc…...

深入解析MySQL索引结构:从数组到B+树的演变与优化

前言&#xff1a; 在数据库查询中&#xff0c;索引是一种关键的性能优化工具。然而&#xff0c;索引的失效可能导致查询效率大幅下降。为了更好地理解索引的工作原理及规避其失效&#xff0c;深入了解索引结构的演变过程尤为重要。 MySQL 的索引数据结构从简单到复杂&#xff0…...

【玩转MacBook】JDK安装

下载 JDK 8 官网&#xff1a;https://www.oracle.com/cn/java/technologies/downloads/archive/ 找到 JDK 8 选择&#xff1a; 安装 JDK 双击 .dmg 文件&#xff1a; 继续双击&#xff1a; “继续” “继续” 走到这里&#xff0c;我发现只能选择这个“为这台电脑上的所有…...

word无法创建工作文件,检查临时环境变量。

word无法创建工作文件&#xff0c;检查临时环境变量。 word preview版本&#xff0c;关联打开文件出现报错。word无法创建工作文件&#xff0c;检查临时环境变量。 打开注册表&#xff0c;删除键 Word Preview: HKCR\CLSID{84F66100-FF7C-4fb4-B0C0-02CD7FB668FE} PowerPoint …...

威联通NAS部署openwrt软路由保姆级教程附镜像文件

创作立场&#xff1a;原创不易&#xff0c;拒绝搬运~ hello 大家好&#xff0c;我是你们的老伙伴&#xff0c;稳重的大王~ 本期教程为大家分享&#xff0c;怎么在NAS里面部署软路由&#xff0c;下面是软路由的镜像文件&#xff0c;有两个版本&#xff0c;400M的是定制版~ Sh…...

MySQL共享锁,排他锁

在 MySQL 中&#xff0c;共享锁&#xff08;S 锁&#xff09; 和 排他锁&#xff08;X 锁&#xff09; 是两种主要的锁机制&#xff0c;用于处理事务的并发控制。它们的作用和行为如下&#xff1a; 1. 共享锁 (S 锁) 定义&#xff1a; 共享锁允许事务对某一行数据进行读取&am…...

2. FPGA基础了解--全局网络

前言 引入扇出的概念介绍FPGA中的全局网络为后续时序优化埋下伏笔 扇出 在FPGA设计中扇出是一个重要的概念&#xff0c;所谓的扇出就是一个控制信号所能控制的数据信号的总个数&#xff0c;比如ctrl信号的扇出就是16 reg ctrl 0; reg [15:0] out 0; always (posedge c…...

[c++进阶(三)]单例模式及特殊类的设计

1.前言 在实际场景中,总会遇见一些特殊情况,比如设计一个类,只能在堆上开辟空间, 或者是设计一个类只能实例化一个对象。那么我们应该如何编写代码呢&#xff1f;本篇将会详细的介绍 本章重点&#xff1a; 本篇文章着重讲解如何设计一些特殊 的类,包括不能被拷贝,只能在栈/堆上…...

js版本之ES6特性简述【let和const、数组、函数、集合、Symbol】(四)

目录 let [块级作用域] 和const简述 Array.from Array.of Array.prototype中新增的方法 for...of 函数参数调整 集合类型 Map Set WeakMap WeakSet Set WeakSet Map WeakMap Symbol 类型 let [块级作用域] 和const简述 ES6 新增了let命令&#xff0c;用来声明变…...

重温设计模式--4、组合模式

文章目录 1 、组合模式&#xff08;Composite Pattern&#xff09;概述2. 组合模式的结构3. C 代码示例4. C示例代码25 .应用场景 1 、组合模式&#xff08;Composite Pattern&#xff09;概述 定义&#xff1a;组合模式是一种结构型设计模式&#xff0c;它允许你将对象组合成…...

解决Ubuntu下无法装载 Windows D盘的问题

电脑安装了 Windows 和 Ubuntu 24.04 后&#xff0c;在Ubuntu系统上装载 D盘&#xff0c;发现无法装载错误如下&#xff1a; Error mounting /dev/nvme0n1p4 at /media/jackeysong/Data: wrong fs type, bad option, bad superblock on /dev/nvme0n1p4, missing codepage or h…...

详细介绍如何使用rapidjson读取json文件

本文主要详细介绍如何使用rapidjson库来实现.json文件的读取&#xff0c;分为相关基础介绍、结合简单示例进行基础介绍、结合复杂示例进行详细的函数实现介绍等三部分。 一、相关基础 1、Json文件中的{} 和 [] 在 JSON 文件中&#xff0c;{} 和 [] 分别表示不同的数据结构&…...

Mybatis 如何复用 SQL

比如你的Mapper是这样写的&#xff1a; 但这个接口是没有分页的&#xff0c;你还想再写一个有分页的查询接口&#xff0c;两个接口SQL一模一样&#xff0c;只是多了分页特性。你可以直接重载一个方法&#xff0c;增加分页参数&#xff0c;即可复用该SQL。如下&#xff1a;...

使用 Python 操作 MySQL 数据库的实用工具类:MySQLHandler

操作数据库是非常常见的需求&#xff0c;使用 Python 和 pymysql 库封装一个通用的 MySQL 数据库操作工具类&#xff0c;并通过示例演示如何使用这个工具类高效地管理数据库。 工具类的核心代码解析 MySQLHandler 类简介 MySQLHandler 是一个 Python 类&#xff0c;用于简化…...

C++ 内存管理:原理、技巧与实战

目录 第一章:C++ 内存管理基础 1.1 C++ 内存布局剖析 1.2 内存分配与释放:核心机制详解 1.2.1 new/delete 操作符 1.2.2 malloc/free 函数 第二章:智能指针 —— 内存管理利器 2.1 智能指针概览 2.2 常用智能指针类型 2.2.1 unique_ptr 2.2.2 shared_ptr 2.2.3 we…...

算法学习(17)—— FloodFill算法

目录 关于FloodFill算法 部分OJ题详解 733. 图像渲染 200. 岛屿数量 695. 岛屿的最大面积 130. 被围绕的区域 417. 太平洋大西洋水流问题 529. 扫雷问题 LCR130. 衣橱整理 关于FloodFill算法 爆搜&#xff0c;深搜&#xff0c;回溯的算法原理并不难&#xff0c;这类题…...

Kubernetes ConfigMap的创建与使用

前提条件 拥有Kubernetes集群环境&#xff0c;可参考&#xff1a;Kubernetes集群搭建理解Kubernetes部署知识&#xff0c;可参考&#xff1a;使用Kubernetes部署第一个应用 、Deloyment控制器 ConfigMap简介 ConfigMap 是 Kubernetes&#xff08;通常简称为 K8s&#xff09;中…...

灵当CRM uploadfile.php 文件上传致RCE漏洞复现

0x01 产品简介 灵当CRM是一款专为中小企业打造的智能客户关系管理工具,由上海灵当信息科技有限公司开发并运营。广泛应用于金融、教育、医疗、IT服务、房地产等多个行业领域,帮助企业实现客户个性化管理需求,提升企业竞争力。无论是新客户开拓、老客户维护,还是销售过程管…...

老旧小区用电安全保护装置#限流式防火保护器参数介绍#

摘要 随着居民住宅区用电负荷的增加&#xff0c;用电安全问题日益突出&#xff0c;火灾隐患频繁发生。防火限流式保护器作为一种新型电气安全设备&#xff0c;能够有效预防因电气故障引发的火灾事故。本文介绍了防火限流式保护器的工作原理、技术特点及其在居民住宅区用电系统…...

在git commit之前让其自动执行一次git pull命令

文章目录 背景原因编写脚本测试效果 背景原因 有时候可以看到项目的git 提交日志里好多 Merge branch ‘master’ of …记录。这些记录是怎么产生的呢&#xff1f; 是因为在本地操作 git add . 、 git commit -m "xxxxx"时&#xff0c;没有提前进行git pull操作&…...

【实现100个unity特效之4】Unity ShaderGraph使用教程与各种特效案例(2023/12/1更新)

文章目录 一、前言二、ShaderGraph1.什么是ShaderGraph2.在使用ShaderGraph时需要注意以下几点&#xff1a;3.优势4.项目 三、实例效果边缘发光进阶&#xff1a;带方向的菲涅尔边缘光效果裁剪进阶 带边缘色的裁剪溶解进阶 带边缘色溶解卡通阴影水波纹积雪效果不锈钢效果、冰晶效…...

单机和微服务的区别,微服务有什么问题?数据一致性问题怎么解决?幂等问题怎么解决?

单机和微服务的区别&#xff0c;微服务有什么问题&#xff1f;数据一致性问题怎么解决&#xff1f;幂等问题怎么解决&#xff1f; 单机架构和微服务架构在设计理念、部署和扩展性上有显著区别。 单机架构 vs 微服务架构 单机架构 定义&#xff1a;所有组件&#xff08;前端…...

McDonald‘s Event-Driven Architecture 麦当劳事件驱动架构

原文链接 1 mcdonalds-technical-blog/ 原文链接 2 mcdonalds-technical-blog/ 麦当劳在异步、事务性和分析性处理用例中使用跨技术栈的事件&#xff0c;包括移动订单进度跟踪和向客户发送营销通信&#xff08;交易和促销&#xff09;。 统一事件平台&#xff08;unified eve…...

Clickhouse(Centos)

地址信息 官网地址&#xff1a;Fast Open-Source OLAP DBMS - ClickHouse 下载地址&#xff1a;packages.clickhouse.com/rpm/stable/ 1.clickhouse-client-23.1.3.5.x86_64.rpm 2.clickhouse-common-static-23.1.3.5.x86_64.rpm 3.clickhouse-common-static-dbg-23.1.3.5.x86_…...

赛博错题本

机构抽象老师非得让我们整一个错题本&#xff0c;我寻思都学计算机了&#xff0c;还在整高中做题呢一套是什么意思呢&#xff0c;更何况考试也就一周一次&#xff0c;你整个本完完全全没有必要&#xff0c;整个赛博错题本得了。以后错题都会存在这里&#xff0c;基本上一周一更…...

【MySQL初阶】Ubuntu 环境安装 MySQL

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; 数据库初阶 &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解 Ubuntu 系统安装 MySQL 的相关内容。 如果看到最后您觉得这篇…...

【Kubernetes 指南】基础入门——Kubernetes 基本概念(二)

目录 二、Pod 1、Pod 简介 2、Pod 图示 3、nginx 容器 二、Pod 1、Pod 简介 - Kubernetes 使用 Pod 来管理容器&#xff0c;每个 Pod 可以包含一个或多个紧密关联的容器。 - Pod 是一组紧密关联的容器集合&#xff0c;它们共享 PID、IPC、Network 和 UTS namespace&#…...

Ubuntu系统下 npm install -g tauri 报错问题处理

处理在安装 Tauri 时遇到的问题&#xff0c;可以按照以下步骤进行操作 npm install -g taurinpm warn deprecated inflight1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async …...

数字逻辑(六)——下载Digital软件

Digital是一种用于设计和仿真数字逻辑电路的教育工具&#xff0c;它是免费、开源和跨平台的。这款软件十分适合新人&#xff0c;可以使用画简单的电路。 1 下载Digital软件 首先Digital的下载地址是&#xff1a; https://github.com/hneemann/Digital ​ 下载完成之后&…...

Ruby Raider使用教程

Ruby Raider是什么&#xff1f; Ruby Raider 是一款生成器和脚手架 gem&#xff0c;可让 UI 测试自动化更容易 Github链接&#xff1a;https://github.com/RaiderHQ/ruby_raider 目前支持的框架 Web自动化测试 Cucumber and Selenium Rspec and Selenium Cucumber and Wa…...

音视频入门基础:AAC专题(13)——FFmpeg源码中,获取ADTS格式的AAC裸流音频信息的实现

音视频入门基础&#xff1a;AAC专题系列文章&#xff1a; 音视频入门基础&#xff1a;AAC专题&#xff08;1&#xff09;——AAC官方文档下载 音视频入门基础&#xff1a;AAC专题&#xff08;2&#xff09;——使用FFmpeg命令生成AAC裸流文件 音视频入门基础&#xff1a;AAC…...

Spring Boot 中的 @Scheduled 定时任务以及开关控制

Scheduled注解是Spring框架&#xff08;包括Spring Boot&#xff09;中用于实现定时任务的一种方式。以下是对Scheduled注解的详细解析&#xff1a; 一、基本概念 Scheduled注解允许开发者在Spring容器中定义定时任务。通过简单地在一个方法上添加Scheduled注解&#xff0c;S…...

基于PXE与NFS共享的Ubuntu安装配置过程

假设存在服务器A、B、C 其中A为待装系统的服务器&#xff0c;DHCP&#xff08;IP池&#xff1a;192.168.0.150~192.168.0.160&#xff09;&#xff0c;假设需要安装的系统为Ubuntu 22.04 Desktop 其中B为PXE服务端服务器&#xff0c;IP: 192.168.0.100&#xff0c;这里将以Cent…...

Dots 常用操作

游戏中有多个蚂蚁群落&#xff0c;每个蚂蚁属于一个群落&#xff0c;如何设计数据结构&#xff1f; 方法1&#xff1a;为蚂蚁组件添加一个属性 ID&#xff0c;会造成逻辑中大量分支语句&#xff0c;如果分支语句逻辑不平衡可能带来 Job 调度问题&#xff0c;每个蚂蚁会有一份蚂…...

力扣-图论-20【算法学习day.70】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…...

ModbusTCP从站转Profinet主站案例

一. 案例背景 在复杂的工业自动化场景中&#xff0c;企业常常会采用不同品牌的设备来构建生产系统。西门子SINAMICS G120变频器以其高性能、高精度的速度和转矩控制功能&#xff0c;在电机驱动领域应用广泛。施耐德M580可编程逻辑控制器则以强大的逻辑控制和数据处理能力著称&…...

Linux 线程池

1.概念介绍 线程池是一种多线程处理形式&#xff0c;它维护着多个线程&#xff0c;这些线程处于等待状态&#xff0c;随时准备接受任务并执行。线程池的主要目的是为了提高系统的性能和资源利用率&#xff0c;避免在处理短时间任务时频繁创建和销毁线程所带来的开销。 线程池…...