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,一经查实,立即删除!

相关文章

云服务器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 版本于不久前推出,更新的新特性可…

【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…

二次供水物联网:HiWoo Cloud助力城市水务管理升级

随着城市化的快速推进,二次供水系统作为城市基础设施的重要组成部分,其稳定运行和高效管理显得至关重要。然而,传统的二次供水管理方式在应对复杂多变的城市供水需求时,显得力不从心。为了破解这一难题,HiWoo Cloud平台…

应用回归分析:弹性网络回归

弹性网络回归:原理、优势与应用 弹性网络回归(Elastic Net Regression)是一种广泛使用的线性回归方法,它结合了岭回归(Ridge Regression)和套索回归(Lasso Regression)的特点。通过…

等保2.0高风险项全解析:判定标准与应对方法

引言 所谓高风险项,就是等保测评时可以一票否决的整改项,如果不改,无论你多少分都会被定为不合格。全文共58页,写得比较细了,但是想到大家基本不会有耐心去仔细看的(凭直觉)。这几天挑里边相对…

Java学习--学生管理系统(残破版)

代码 Main.java import java.util.ArrayList; import java.util.Scanner;public class Main {public static void main(String[] args) {ArrayList<Student> list new ArrayList<>();loop:while (true) {System.out.println("-----欢迎来到阿宝院校学生管理系…

可视化图文报表

Apache Echarts介绍 Apache Echarts是一款基于Javascript的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表。 官网&#xff1a;Apache ECharts 入门案例&#xff1a; <!DOCTYPE html> <html>…

C#,弗洛伊德-瑞文斯特(Floyd-Rivest)算法与源代码

Robert W. Floyd 1 Floyd-Rivest 算法 Floyd-Rivest 算法是一种选择算法&#xff0c;用于在不同元素的数组中找到第k个最小元素。它类似于快速选择算法&#xff0c;但在实际运行中有更好的运行时间。 和 QuickSelect 一样&#xff0c;该算法基于分区的思想工作。对数组进行分…

济南适宜地提取

题目: 网上下载中国的DEM、土地利用地图(1980、2000、2015年的)和一张最新济南市行政区划 图(要求:莱芜市并入济南后的区划图); 2.网上下载中国2015年年平均降水空间插值数据;3..网上下载中国2015年年平均气温空间插值数据; (注:以上数据可到资源环境科学与数据中心下载http…

【Docker】安装及相关的命令

目录 一 Docker简介 1.1 是什么 1.2 优缺点 1.3 应用场景 1.4 安装 二 命令 2.1 Docker基本命令 2.2 Docker镜像命令 2.3 Docker容器命令 一 Docker简介 1.1 是什么 Docker是一个开源的应用容器引擎&#xff0c;它基于Go语言实现&#xff0c;并利用操作系统本身已有的…

【QT+QGIS跨平台编译】之五十四:【QGIS_CORE跨平台编译】—【qgssqlstatementlexer.cpp生成】

文章目录 一、Flex二、生成来源三、构建过程一、Flex Flex (fast lexical analyser generator) 是 Lex 的另一个替代品。它经常和自由软件 Bison 语法分析器生成器 一起使用。Flex 最初由 Vern Paxson 于 1987 年用 C 语言写成。 “flex 是一个生成扫描器的工具,能够识别文本中…