找到一个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

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

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

相关文章

uniapp实现为微信小程序扫一扫的功能

引言 随着微信小程序的快速发展,越来越多的开发者开始关注和学习微信小程序的开发。其中,微信小程序的扫一扫功能是非常常用且实用的功能之一。通过扫描二维码,用户可以获取到相关的信息或者实现特定的功能。 正文 在过去,开发者需要使用微信开发者工具以及相关的开发文档…

中科岩创边坡自动化监测解决方案

行业现状 由于边坡不稳定性因素,可能会造成斜坡上的岩土体沿着某个面不均匀向下向外滑动,形成滑坡;陡峭山坡上岩土体在重力作用下,发生陡然倾落运动,造成崩塌;在沟谷或山坡上产生的夹带大量泥沙、石块等固体…

uniapp使用live-pusher实现模拟人脸识别效果

需求: 1、前端实现模拟用户人脸识别,识别成功后抓取视频流或认证的一张静态图给服务端。 2、服务端调用第三方活体认证接口,验证前端传递的人脸是否存在,把认证结果反馈给前端。 3、前端根据服务端返回的状态,显示在…

Docker【初识Docker】

目录 为什么会出现Docker这门技术喃? 应用开发和部署的困境 容器技术的先兆 Docker 的出现:简化容器化 Docker 技术的关键创新: Docker 的广泛应用和变革 什么是 Docker? Docker的历史 早期背景:容器化和虚拟化…

探寻 OneCode 核心优势:MVVM 进阶与前后端协同之魅

在当今的软件开发领域,高效、可维护且功能强大的架构是开发者们不懈追求的目标。OneCode 凭借其独特的增强版 MVVM 架构、前后端一体化特性,以及创新的技术如 OneCode DSM(Domain-Specific Modeling,领域特定建模)、视…

网络安全检测

实验目的与要求 (1) 帮助学生掌握木马和入侵的防护和检测方法、提高学习能力、应用能力和解决实际问题的能力。 (2) 要求学生掌握方法, 学会应用软件的安装和使用方法, 并能将应用结果展示出来。 实验原理与内容 入侵检测是通过对计算机网络或计算机系统中若干关键点收集信…

24.12.27 SpringMVCDay02

enctype必须是 multipart/form-data <form action"/mvc/book/doUpload1" method"post" enctype"multipart/form-data"><p><input type"file" name"img_url"></p><p><input type"subm…

Maven核心概念总结

Maven 介绍 Maven 官方文档是这样介绍的 Maven 的&#xff1a; Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a projects build, reporting and documentation from a ce…

Unity 读Excel,读取xlsx文件解决方案

Unity读取表格数据 效果&#xff1a; 思路&#xff1a; Unity可以解析Json&#xff0c;但是读取Excel需要插件的帮助&#xff0c;那就把这个功能分离开&#xff0c;读表插件就只管读表转Json&#xff0c;Unity就只管Json解析&#xff0c;中间需要一个存储空间&#xff0c;使用…

PyQt + OpenCV综合训练

一、PyQt OpenCV 图像处理应用设计 创建一个 PyQt 应用程序&#xff0c;该应用程序能够&#xff1a; ①使用 OpenCV 加载一张图像。 ②在 PyQt 的窗口中显示这张图像。 ③提供四个按钮&#xff08;QPushButton&#xff09;&#xff1a; - 一个用于将图像转换为灰度图 - …

React中最优雅的异步请求

给大家分享在React19中使用useSuspense处理异步请求为什么是被认为最优雅的解决方案 一. 传统方案 解决异步请求的方案中&#xff0c;我们要处理至少两个最基本的逻辑 正常的数据显示数据加载的UI状态 例如&#xff1a; export default function Index(){const [content, …

数据库高安全—openGauss安全整体架构安全认证

openGauss作为新一代自治安全数据库&#xff0c;提供了丰富的数据库基础安全能力&#xff0c;并逐步完善各类高阶安全能力。这些安全能力涵盖了访问登录认证、用户权限管理、审计与追溯及数据安全隐私保护等。本章节将围绕openGauss安全机制进行源码解读&#xff0c;以帮助数据…

linux-23 文件管理(一)创建文件touch,stat

那接下来看看文件的创建和删除&#xff0c;那我们怎么去创建一个文件&#xff1f;各种方式都能实现&#xff0c;当然&#xff0c;这里先说一说&#xff0c;就像mkdir创建空目录一样&#xff0c;我们如何创建一个空文件&#xff1f;创建空文件其实很简单&#xff0c;有一个命令歪…

Linux 基本指令

目录 1.常见指令 1.1 ls指令 1.2 pwd指令 1.3 cd指令 1.4 touch指令 1.5 mkdir指令 1.6 rm和rmdir指令 1.7 man指令 1.8 cp指令 1.9 mv指令 ​编辑 1.10 cat指令 1.11 more指令 1.12 less指令 1.13 head指令 1.14.tail指令 1.15 时间相关的指令 1.16 cal…

金蝶V10中间件的使用

目录 环境准备搭建过程配置修改应用部署 环境准备 Linux内核服务器JDK1.8安装包&#xff1a;AAS-V10.zip程序包&#xff1a;***.war 搭建过程 将安装包上传至服务器opt目录下&#xff0c;官方给定的默认服务主目录为“/opt/AAS-V10/ApusicAS/aas/”&#xff1b;解压安装包(解…

前端开发 -- 自动回复机器人【附完整源码】

一&#xff1a;效果展示 本项目实现了一个简单的网页聊天界面&#xff0c;用户可以在输入框中输入消息&#xff0c;并点击发送按钮或按下回车键来发送消息。机器人会根据用户发送的消息内容&#xff0c;通过关键字匹配来生成自动回复。 二&#xff1a;源代码分享 <!DOCTYP…

Python数据可视化小项目

英雄联盟S14世界赛选手数据可视化 由于本学期有一门数据可视化课程&#xff0c;课程结课作业要求完成一个数据可视化的小Demo&#xff0c;于是便有了这个小项目&#xff0c;课程老师要求比较简单&#xff0c;只要求熟练运用可视化工具展示数据&#xff0c;并不要求数据来源&am…

Linux系统编程——详解页表

目录 一、前言 二、深入理解页表 三、页表的实际组成 四、总结&#xff1a; 一、前言 页表是我们之前在讲到程序地址空间的时候说到的&#xff0c;它是物理内存到进程程序地址空间的一个桥梁&#xff0c;通过它物理内存的数据和代码才能映射到进程的程序地址空间中&#xff…

【Java数据结构】LinkedList与链表

认识LinkedList LinkedList就是一个链表&#xff0c;它也是实现List接口的一个类。LinkedList就是通过next引用将所有的结点链接起来&#xff0c;所以不需要数组。LinkedList也是以泛型的方法实现的&#xff0c;所以使用这个类都需要实例化对象。 链表分为很多种&#xff0c;比…

《一文读懂卷积网络CNN:原理、模型与应用全解析》

《一文读懂卷积网络CNN&#xff1a;原理、模型与应用全解析》 一、CNN 基本原理大揭秘&#xff08;一&#xff09;从人类视觉到 CNN 灵感&#xff08;二&#xff09;核心组件详解 二、经典 CNN 模型巡礼&#xff08;一&#xff09;LeNet-5&#xff1a;开山鼻祖&#xff08;二&a…