Linux——静态库

Linux——静态库

  • 静态库
    • 分析一下
  • ar指令生成静态库
  • 静态库的使用
    • 第三方库
    • 优化一下
  • gcc -I(大写的i) -L -l(小写的l),头文件搜索路径,库文件搜索路径,连接库

今天我们来学习静态库的基本知识。

静态库

在了解静态库之前,我们首先来回忆一下gcc的三个编译选项:

gcc -E 生成.i 文件 预处理
gcc -S 生成.s文件 编译
gcc -c 生成.o 文件 汇编

如果大家有点陌生,大家可以点击这里复习一下:

https://blog.csdn.net/qq_67693066/article/details/132868367

生成.o文件之后,我们就要进行连接,让我们的程序跑起来。我们今天的主要的部分主要集中在.o文件上。

我们首先模拟一个简单的加减场景,编写一个程序完成加减,包含完整的头文件和.c文件:
在这里插入图片描述
其中我们的Test.c是程序运行的入口,Add和Sub的头文件和.c文件为我们的Test.c服务。

然后我们编写Makefile:
在这里插入图片描述

这里注意一下 %.o : %c这个叫做模式规则,这段代码简单来说就是将后缀为.c的文件依次生成.o文件,我们将Test.c入口编写好:
在这里插入图片描述
之后make一下:
在这里插入图片描述

看到我们已经成功生成了Test可执行文件,我们运行一下来看看:
在这里插入图片描述

分析一下

我们回到Makefile:
在这里插入图片描述
我们知道Test这个执行文件依赖于Add.o,Sub.o 和 Test.c生成,我们再来想想,Test.c是我们人为写的程序的入口,意思就是,如果别人写一个程序的入口,只要他可以拿到Add.o 和Sub.o 就可以运行程序。那为什么我不把Add.o和Sub.o打包?如果别人要用这个程序,我直接把这个包发给他就可以用了,这不是很方便嘛。这个包我们称为静态库,这个头文件,就是库的使用说明书

静态库(Static Library)是一种包含预编译目标文件的集合的归档文件,它在链接时被整体复制到可执行文件中。静态库的目的是为了提供代码重用和模块化,使得在编译时将所有需要的代码和数据都链接到最终的可执行文件中。
静态库的文件通常具有 .a(在Unix/Linux系统中)或 .lib(在Windows系统中)的文件扩展名。它包含了一组预编译的目标文件(通常是 .o 文件),这些目标文件是通过编译源代码而生成的。
主要优点和特点包括:
独立性: 静态库包含所有代码和数据,因此它是独立于其他库的,不依赖于运行时环境。
链接时静态绑定: 静态库在链接时会被完全复制到可执行文件中,因此在运行时不需要外部的库文件。
性能: 由于在链接时已经将代码和数据整合到可执行文件中,因此执行时的性能可能会更好。

ar指令生成静态库

我们知道了原理之后,我们可以用指令生成静态库,我们在Makefile中:
在这里插入图片描述

在这里插入图片描述

静态库的使用

我们现在有了静态库,我们现在重新建一个文件,来模拟其他程序员拿到库的情况。
我们新建一个Test_2的文件夹,把main函数写好:
在这里插入图片描述
如果我们此时直接编译:
在这里插入图片描述
这个时候会报错,说没有头文件,此时我们要把头文件搬到这个目录下,顺便把静态库也搬过来:
在这里插入图片描述
这个时候我们再来编译:
在这里插入图片描述
此时没有报没有头文件的错误了,但是编译器还是不知道怎么做,报了链接错误。但是我们不是已经把库拷贝过来了吗?按理来说应该可以呀?

第三方库

其实我们自己写的库为第三方库,编译器一般不认识,如果我们要运行程序,我们需要告诉编译器到哪里去连接这个第三方库:

gcc Test.c -L(后面跟这个第三方库的路径) -l(第三方库的名称)

这里注意下,这个第三方库的名称是去掉前缀和后缀的,比如libmymath.a去掉前缀lib去掉后缀.a,这个库的名字应该为mymath。

我们来试试:
在这里插入图片描述

优化一下

刚刚我们执行程序时,还要把我们的头文件一个一个搬下来,这个属实不咋方便,我们可以优化一下:

我们打开Makefile:
在这里插入图片描述
我们把头文件也打包一下,我们测试一下:
在这里插入图片描述
在这里插入图片描述

我们有了库,我们可以压缩这个库:
在这里插入图片描述
这个时候,mymath_lib.tgz就可以拿到网上让别人下载了。不过,假设我是其他的程序员,拿到了其他人写的库,这个时候我该如何使用这个库呢?

我们有一个include目录,这里是专门存放头文件的:
在这里插入图片描述

还有一个lib64,是专门存放动静态库的:
在这里插入图片描述
我们要做的其实很简单,就是把对应的头文件和库安装到相应的目录下就可以了。这个过程我们称为安装开发环境

gcc -I(大写的i) -L -l(小写的l),头文件搜索路径,库文件搜索路径,连接库

我们gcc一般搜索头文件,会从全局的/usr/include搜索,然后会从当前路径寻找。其实我们可以带 -I(大写的i),建议编译器也从这里找头文件:
在这里插入图片描述

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

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

相关文章

MongoDB - readConcern

readConcern 是 MongoDB 提供的一个功能,用于控制在读取操作期间所使用的数据一致性级别。在分布式环境中,可能会出现数据读取时的一致性问题,readConcern 允许您指定在读取数据时所需的一致性级别,以满足特定的业务需求。 在 Mo…

云服务器ECS价格表出炉_2024年最新价格表——阿里云

2024年最新阿里云服务器租用费用优惠价格表,轻量2核2G3M带宽轻量服务器一年61元,折合5元1个月,新老用户同享99元一年服务器,2核4G5M服务器ECS优惠价199元一年,2核4G4M轻量服务器165元一年,2核4G服务器30元3…

BL0942 内置时钟免校准计量芯片 用于智能家居领域 低成本

BL0939是上海贝岭股份有限公司开发的一款用于智能家居领域进行电能测量的专用芯片,支持两路测量,可同时进行计量和漏电故障检测,漏电检测电流可设,响应时间快,具有体积小,外围电路简单,成本低廉…

模拟器和电脑端adb版本不一致解决办法

window电脑和模拟器的adb版本不一致,如何解决? 1.查看自己电脑的adb版本;使用adb --version 2.查看模拟器的adb版本 cmd切换至模拟器bin目录,输入nox_adb --version 3.要找到电脑端的adb在哪个目录下;where adb 4.打…

六、防御保护---防火墙内容安全篇

六、防御保护---防火墙内容安全篇 一、IAE(Intelligent Awareness Engine)引擎二、深度检测技术(DFI和DPI)2.1 DPI -- 深度包检测技术2.1.1 基于“特征字”的检测技术2.1.2 基于应用网关的检测技术2.1.3 基于行为模式的检测技术 2.2 DFI -- 深…

【Go 快速入门】协程 | 通道 | select 多路复用 | sync 包

文章目录 前言协程goroutine 调度使用 goroutine 通道无缓冲通道有缓冲通道单向通道 select 多路复用syncsync.WaitGroupsync.Mutexsync.RWMutexsync.Oncesync.Map 项目代码地址:05-GoroutineChannelSync 前言 Go 1.22 版本于不久前推出,更新的新特性可…

git describe

git describe一般用于查看当前提交距离上次最近的tag是什么,并且还可以知道差了多少个commit,在工程实践当中是个非常好用的命令 如果git describe后面什么都不加的话,默认找的是最近的有注释的tag 如何打有注释的tag打注释? g…

vue-router4 (五) 路由传参的2种方法

以A组件向B组件传参为例: 方法1: A组件中传数据(用path query): const toDetail (item:TtemType)>{router.push({path:"/reg", //对应路由中的path路径query: item //将传递的数据放在query中&a…

【Git】解决‘每次初始化一个新仓库时,都需要执行git config --global --add safe.directory命令‘

问题 这个命令是用来将一个安全目录添加到全局的 Git 配置中。但每次克隆一个仓库或者新建一个仓库,并且对该仓库进行操作时,都需要执行该命令,十分麻烦! 这是因为,Git 近期进行了版本升级,添加了新的目录…

【python + flask】字典字段对模型字段的自动赋值,抽象编程思维培养,框架能力

场景: 客户端提交上来的数据 # Time :2024-2024/2/27-10:40 # Author :Justin # Email :514422868qq.com # file :demo1.py # Software :FisherBook# class A(): # def __enter__(self): # print("I am enter!") # …

Python3学习笔记39-passlib

passlib处理密码哈希的python包,支持很多哈希算法和工具 bcrypt 安装 pip install passlib[bcrypt] 会安装passlib包和bcrypt两个包 密码哈希与校验 from passlib.context import CryptContext# 创建CryptContext对象,指定加密算法 pwd_context CryptContext…

大语言模型构建的主要四个阶段(各阶段使用的算法、数据、难点以及实践经验)

大语言模型构建通常包含以下四个主要阶段:预训练、有监督微调、奖励建模和强化学习,简要介绍各阶段使用的算法、数据、难点以及实践经验。 预训练 需要利用包含数千亿甚至数万亿 单词的训练数据,并借助由数千块高性能 GPU 和高速网络组成的…

【测试】微软测试框架playwright的使用

Playwright常用知识点 1.playwright2.配置要求3.安装4.打开浏览器4.1 上下文模式4.2 交互模式4.3 异步打开 5.常用对象5.1 Browser5.2 BrowserContext5.3 Page 6.元素定位器(Locator)6.1 css、xpath、text定位器6.2 文本定位器6.3 get_by_role6.4 get_by…

非阻塞式 I/O 模型的工作原理【NIO】

非阻塞式 I/O(Non-blocking I/O,NIO)是一种改进的 I/O 模型,引入了通道(Channel)和缓冲区(Buffer)的概念。相比于阻塞式 I/O,非阻塞式 I/O 允许在进行读/写操作时不会导致…

【pytorch】函数记录

你好你好! 以下内容仅为当前认识,可能有不足之处,欢迎讨论! 文章目录 torch.sum()torch.argmax()torch.nn.Parametertorch.unbindtorch.optim.Adam()[^adam]torch.cattorch.unsqueeze()torch.normalize()[^l2]torch.eyetorch.mmto…

Elasticsearch使用function_score查询酒店和排序

需求 基于用户地理位置,对酒店做简单的排序,非个性化的推荐。酒店评分包含以下: 酒店类型(依赖用户历史订单数据):希望匹配出更加符合用户使用的酒店类型酒店评分:评分高的酒店用户体验感好ge…

在Ubuntu22.04 LTS上搭建Kubernetes集群

文章目录 准备工作系统准备软件包准备主机和IP地址准备 安装步骤安装前准备关闭防火墙设置服务器时区关闭 swap 分区关闭SELinux配置hosts配置文件转发 IPv4 并让 iptables 看到桥接流量 安装容器运行时安装Kubernetes配置并安装apt包初始化集群 安装calico网络插件部署应用 本…

nvm下载node指定版本后npm不存在

一,项目背景 接手一个老的项目,需要使用旧的node版本,使用nvm下载12.11.0版本后发现npm命令不存在。 二,原因 查找资料发现是8.11以上版本的node版本对应的npm都没法自动安装,需要自己到npm官网( https://registry.…

详解Kotlin中run、with、let、also与apply的使用和区别

Kotlin作为一种现代、静态类型的编程语言,不仅提供了丰富的特性,还提供了极具表现力的函数:run, with, let, also, 和 apply。理解这些函数的不同之处对于编写高效、易于维护的代码至关重要。 函数对比表 函数对象引用返回值使用场景runthi…

DB-GPT:大模型 + 数据库,全流程自动化

DB-GPT:大模型 数据库,全流程自动化 提出背景DB-GPT 结构具体问题与解法背景分析对比其他工具DB-GPT系统设计 提出背景 论文:https://arxiv.org/pdf/2312.17449.pdf 代码:https://github.com/eosphoros-ai/DB-GPT 本文介绍了D…