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

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),建议编译器也从这里找头文件:
在这里插入图片描述

相关文章:

Linux——静态库

Linux——静态库 静态库分析一下 ar指令生成静态库静态库的使用第三方库优化一下 gcc -I(大写的i) -L -l(小写的l),头文件搜索路径,库文件搜索路径,连接库 今天我们来学习静态库的基本知识。 静态库 在了解静态库之前,我们首先来…...

fastjson序列化MessageExt对象问题(1.2.78之前版本)

前言 无论是kafka&#xff0c;还是RocketMq&#xff0c;消费者方法参数中的MessageExt对象不能被 fastjson默认的方式序列化。 一、查看代码 Override public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,ConsumeConcurrentlyContext context) {t…...

osi模型,tcp/ip模型(名字由来+各层介绍+中间设备介绍)

目录 网络协议如何分层 引入 osi模型 tcp/ip模型 引入 命名由来 介绍 物理层 数据链路层 网络层 传输层 应用层 中间设备 网络协议如何分层 引入 我们已经知道了网络协议是层状结构,接下来就来了解了解下网络协议如何分层 常见的网络协议分层模型是OSI模型 和 …...

ElasticSearch之找到乔丹的空中大灌篮电影

写在前面 本文看一个搜索的实际例子&#xff0c;找到篮球之神乔丹的电影Space Jam&#xff0c;即空中大灌篮。 正式开始之前先来看下要查询的目标文档&#xff0c;以及查询的text&#xff1a; 要查询的目标文档 {..."title": "Space Jam",..."ove…...

CSS @符规则(@font-face、@keyframes、@media、@scope等)

随着前端开发的不断发展&#xff0c;CSS 的功能日益强大&#xff0c;其中 规则扮演着举足轻重的角色。它们不仅扩展了 CSS 的功能边界&#xff0c;还为开发者提供了更加灵活和高效的样式定义方式&#xff0c;让我们来一同探索这些强大而实用的 规则吧&#xff01; font-face …...

uniapp微信小程序解决上方刘海屏遮挡

问题 在有刘海屏的手机上&#xff0c;我们的文字和按钮等可能会被遮挡 应该避免这种情况 解决 const SYSTEM_INFO uni.getSystemInfoSync();export const getStatusBarHeight ()> SYSTEM_INFO.statusBarHeight || 15;export const getTitleBarHeight ()>{if(uni.get…...

项目:shell实现多级菜单脚本编写

目录 1. 提示 2. 演示效果 2.1. 一级菜单 2.2. 二级菜单 2.3. 执行操作 3. 参考代码 1. 提示 本脚本主要实现多级菜单效果&#xff0c;并没有安装LAMP、LNMP环境&#xff0c;如果要用在实际生成环境中部署LNMP、LAMP环境&#xff0c;只需要简单修改一下就可以了。 2. 演…...

Collections常用方法(Java)

Collections常用方法 使用 sort(List<T> list) 对 List 进行排序&#xff1a; List<Integer> numbers new ArrayList<>(Arrays.asList(3, 1, 4, 1, 5, 9, 2, 6)); Collections.sort(numbers); System.out.println("排序后的列表&#xff1a;" …...

Mysql整理-概述

Mysql概述 MySQL是一种流行的开源关系数据库管理系统(RDBMS),它使用结构化查询语言(SQL)来访问、管理和处理数据。它是基于客户端-服务器模型的数据库,意味着数据存储在服务器上,而用户可以通过客户端软件从不同的位置访问这些数据。 MySQL的主要特点包括: 开源软件:M…...

ubuntu+QT+ OpenGL环境搭建和绘图

一&#xff0c;安装OpenGL库 安装OpenGL依赖项&#xff1a;运行sudo apt install libgl1-mesa-glx命令安装OpenGL所需的一些依赖项。 安装OpenGL头文件&#xff1a;运行sudo apt install libgl1-mesa-dev命令来安装OpenGL的头文件。 安装GLUT库&#xff1a;GLUT&#xff08;Ope…...

Vue实现打印功能(vue-print-nb)

1、安装依赖 npm install vue-print-nb --save2、在main.js中引入 import Print from vue-print-nb Vue.use(Print)3、在组件的打印区域标签上加 id“printArea” <div id"printArea"> 打印区域 </div>4、在组件的打印按钮标签上使用指令 v-print“pr…...

【JSON2WEB】06 JSON2WEB前端框架搭建

【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 前端技术路线太多了&#xff0c;知识点更多&…...

【蓝桥杯单片机入门记录】动态数码管

目录 一、数码管动态显示概述 二、动态数码管原理图 &#xff08;1&#xff09;原理图 &#xff08;2&#xff09;动态数码管如何与芯片相连 &#xff08;3&#xff09;“此器件” ——>锁存器74HC573 三、动态数码管显示例程 &#xff08;1&#xff09;例程1&#xf…...

12 Redis之Lua脚本

11. Lua脚本 Lua 是一个由标准 C 语言开发的、开源的、可扩展的、轻量级的、弱类型的、解释型脚本语言 常用于Nginx/分布式锁/ 先下载并安装Lua...

网络安全之内容安全

内容安全 攻击可能只是一个点&#xff0c;防御需要全方面进行 IAE引擎 DFI和DPI技术--- 深度检测技术 DPI --- 深度包检测技术--- 主要针对完整的数据包&#xff08;数据包分片&#xff0c;分段需要重组&#xff09;&#xff0c;之后对 数据包的内容进行识别。&#xff08;应用…...

在CentOS上使用Docker搭建Halo博客并实现远程访问的详细指南

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. Docker部署Halo1.1 检查Docker版本1.2 在Docker中部署Halo 二. Linux安装Cpol…...

数据结构day5

link_stack.c #include "link_stack.h" //申请栈顶指针 top_p create_top() {top_p top (top_p)malloc(sizeof(top_t));if(topNULL){printf("空间申请失败\n");return NULL;}top->len 0;top->ptop NULL; //刚申请栈指针时没有指向元素return to…...

基础!!!吴恩达deeplearning.ai:神经网络中使用softmax

以下内容有任何不理解可以翻看我之前的博客哦&#xff1a;吴恩达deeplearning.ai 文章目录 softmax作为输出层的神经网络Tensorflow的实现softmax的改进实现数值舍入误差(Numerical Roundoff Errors)sigmoid修改修改softmax 在上一篇博客中我们了解了有关softmax的原理相关内容…...

mapbox高德地图与相机

mapbox高德地图与相机 本案例使用Mapbox GL JavaScript库创建高德地图。 演示效果引入 CDN 链接地图显示 创建地图实例定义地图数据源配置地图图层 设置地图样式实现代码 1. 演示效果 2. 引入 CDN 链接 <script src"https://api.mapbox.com/mapbox-gl-js/v2.12.0/mapb…...

Eslint在Vscode中使用技巧的相关技巧

ps :该文章会详细结论构建一个脚手架遇到的问题&#xff0c;会持续更新&#xff0c;请定时查看 Eslint相关​ 在vscode中使用eslint插件 在vscode中用户配置没有开启eslint.enable 在vscode中工作区配置开启eslint.enable settings.json中没有做eslint相关配置 在编写的vue…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...

CSS3相关知识点

CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...

Linux基础开发工具——vim工具

文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...

__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined.

这个警告表明您在使用Vue的esm-bundler构建版本时&#xff0c;未明确定义编译时特性标志。以下是详细解释和解决方案&#xff1a; ‌问题原因‌&#xff1a; 该标志是Vue 3.4引入的编译时特性标志&#xff0c;用于控制生产环境下SSR水合不匹配错误的详细报告1使用esm-bundler…...

职坐标物联网全栈开发全流程解析

物联网全栈开发涵盖从物理设备到上层应用的完整技术链路&#xff0c;其核心流程可归纳为四大模块&#xff1a;感知层数据采集、网络层协议交互、平台层资源管理及应用层功能实现。每个模块的技术选型与实现方式直接影响系统性能与扩展性&#xff0c;例如传感器选型需平衡精度与…...

uniapp获取当前位置和经纬度信息

1.1. 获取当前位置和经纬度信息&#xff08;需要配置高的SDK&#xff09; 调用uni-app官方API中的uni.chooseLocation()&#xff0c;即打开地图选择位置。 <button click"getAddress">获取定位</button> const getAddress () > {uni.chooseLocatio…...

使用 uv 工具快速部署并管理 vLLM 推理环境

uv&#xff1a;现代 Python 项目管理的高效助手 uv&#xff1a;Rust 驱动的 Python 包管理新时代 在部署大语言模型&#xff08;LLM&#xff09;推理服务时&#xff0c;vLLM 是一个备受关注的方案&#xff0c;具备高吞吐、低延迟和对 OpenAI API 的良好兼容性。为了提高部署效…...

Unity基础-Mathf相关

Unity基础-Mathf相关 一、Mathf数学工具 概述 Mathf是Unity中封装好用于数学计算的工具结构体&#xff0c;提供了丰富的数学计算方法&#xff0c;特别适用于游戏开发场景。它是Unity开发中最常用的数学工具之一&#xff0c;能够帮助我们处理各种数学计算和插值运算。 Mathf…...