Linux第五讲----gcc与g++,makefile/make
1.代码编译
1.1预处理
我们通过vim编辑完文件之后,想看一下运行结果这时我们便可以试用gcc编译C语言,g++编译c++.
编译代码:

上述两种方法均可,code.c是我的c语言文件,mycode是我给编译后产生的二进制文件起的名(随便起)(-o后面加可执行程序名)
下面我们来了解一下预处理的作用
输入如下内容

解释:-E表示从现在开始进行程序的编译,当预处理完毕时,翻译工作就会停下来
code.c 文件在经过预处理后会形成一个二进制文件我们起名为code.i 。下面我们打开它看一下!

由此对比,我们得出结论:预处理进行宏替换,去注释,条件编译,以及头文件展开,而在预处理之后,便没有了注释,也没有了头文件
1.2 编译
输入如下内容,将code.i进行编译并生成汇编
![]()
-s表示 从现在开始进行程序的编译,编译完成就停下来
1.3 汇编
![]()
-c 表示 从现在开始进行程序的翻译,汇编完成就停下来
code.o为可重定位目标二进制文件,即重新填写目标函数在库中的地址,该文件机器可以识别,
1.4 链接

生成可执行文件和库文件
linux中,动态库以.so结尾,静态库以.a结尾
2.库
2.1 动态库和静态库
首先是动态库,在windows中是以.dll为后缀,而在linux中是以.so为后缀,动态库形成动态链接
然后是静态库,在windows中是以.lib为后缀,而在linux中是以.a为后缀,静态库形成静态链接
2.2优缺点比较
动态库:
优点:节省资源
缺点:一旦丢失,所有程序无法直接运行,而且在运行时会稍微慢一点点
静态链接:
优点:不依赖任何库,自己就能独立运行
缺点:体积大,占据资源多(占磁盘空间,内存空间),加载速度受影响
3.make/makefile
3.1基本概念
make是一个Linux系统内置的命令,makefile是一个需要工程师自己建立的一个文件(m大小写都行)
3.2编写代码
我们创建一个makefile文件,并在文件中写入如下内容,注意,gcc前面的空格为TAB键!

之后我们输入的make命令会自动寻找Makefile,也就是说make会解释makefile的命令并形成可执行程序,在这里叫code
我们在make之后可以看一下会形成叫code的可执行程序

但是每次编译都会形成code文件清理起来比较麻烦,因此我们在Makefile文件在加一些东西

这样,当我们想清理时,直接make clean就行了 
3.3结论

code.c表示目标文件,而code.c和code是有依赖关系的,表示code依赖code.c,只有依赖关系+依赖方法结合在一起我们才能成功的编译

.PHONY:表示被修饰的目标是一个伪目标,而伪目标总是被执行的!
我们先来了解一下什么叫做不被执行
我们尝试输入几次make指令,会得到如下界面

这是因为我们第一次已经编译过这个文件了,再次编译时为了提升效率,便会提示这个,但是如果我们将Makefile改成这样在试试

因此,可执行程序不要修饰成为PHONY,clean修饰成为总是执行的
而出现上述结果差异的原因我在后文中会讲述!
随后我们再看一下文件的详细信息,输入
![]()
得到

其中,Access表示最近被访问的时间(特殊)
modify表示文件内容最近修改时间
change表示文件属性的最近修改时间
比如我现在将code.c的内容修改一下,
modify变了,但是change也变了,这是因为内容被修改时,他的属性也会变化
再将权限改一下:

发现change改变了
那么make/makefile是怎么知道需不需要重新编译的呢?
由于源文件本身有一个modify时间,而可执行程序也有一个modify时间,需要对比二者的时间,如果源文件最新就要编,可执行文件最新就不用编,这也就是为什么前文make之后就不能在编译了而改一下源文件后又可以编译的原因
3.4 底层
我们将makefile的代码改一改,这样的

会发现这个依赖关系是一层一层的
3.5 注释
在makefile中,注释用#,方法同上一篇博文
3.6打印
我们在makefile输入如下内容:

之后可以打印我们的内容

会有两个内容,但有一个是过程,也叫回显,我们不妨加个@关闭回显


这样我们便关闭了回显
3.7定义变量

验证一下:
所以我们将代码改造一下:
这样我们便可以按照所需改造代码了
简化:

$@代表$(BIN),$^代表$(SRC) (:右边的所有内容)
所以最终我们将其写成这个形式

但是倘若我们有很多code.c,一次一次写很麻烦,所以我们改进一下:
用wildcard
(目标文件列表)
这样就不用担心多个文件了

相关文章:
Linux第五讲----gcc与g++,makefile/make
1.代码编译 1.1预处理 我们通过vim编辑完文件之后,想看一下运行结果这时我们便可以试用gcc编译C语言,g编译c. 编译代码: 上述两种方法均可,code.c是我的c语言文件,mycode是我给编译后产生的二进制文件起的名&#x…...
ubuntu22.04下Meshlab打开obj文件闪退——使用Appimage并放入收藏夹中
文章目录 ubuntu22.04下Meshlab打开obj文件闪退,查了下是meshlab的apt没做好。 官网下载:https://www.meshlab.net/#download 赋予权限 sudo chmod a+x MeshLab2023.12-linux.AppImage 双击运行即可 打开权限——下面操作是放在桌面上的 创建桌面快捷方式 # 在 ~/desktop (…...
MAVEN的环境配置
在下载好maven后或解压maven安装包后进行环境配置 1.在用户环境变量中 新建一个MAVEN_HOME 地址为MAVEN目录 注:地址为解压后maven文件的根目录!!! 2.在系统环境变量的path中添加该变量 %MAVEN_HOME%\bin 3. 测试maven安装是否成…...
强化学习无痛上手笔记第1课
文章目录 Markov Decision ProcessDefinitionRelated Concepts Policy for MDP AgentDefinitionJudgement for PolicyValue FunctionsTD formula for value functionsRelation of V and QPolicy CriterionPolicy Improvement TheoremOptimal PolicyReinforcement Learning Fund…...
智能设备上的 AI 移植与部署:新趋势与实践案例
1. 引言:智能设备如何运行 AI? 随着人工智能(AI)技术的快速发展,AI 计算已经从云端走向边缘,嵌入到智能设备中,如智能手机、智能摄像头、机器人、自动驾驶汽车等。这种本地化 AI 计算能够减少延…...
【USRP】NVIDIA Sionna:用于 6G 物理层研究的开源库
目录 Sionna:用于 6G 物理层研究的开源库主要特点实现6G研究的民主化支持 5G、6G 等模块化、可扩展、可伸缩快速启动您的研究 好处原生人工智能支持综合研究平台开放生态系统 安装笔记使用 pip 安装基于Docker的安装从源代码安装“你好世界!”探索锡奥纳…...
LLM大型语言模型(一)
1. 什么是 LLM? LLM(大型语言模型)是一种神经网络,专门用于理解、生成并对人类文本作出响应。这些模型是深度神经网络,通常训练于海量文本数据上,有时甚至覆盖了整个互联网的公开文本。 LLM 中的 “大” …...
BUU44 [BJDCTF2020]ZJCTF,不过如此1 [php://filter][正则表达式get输入数据][捕获组反向引用][php中单双引号]
题目: 我仿佛见到了一位故人。。。也难怪,题目就是ZJCTF 按要求提交/?textdata://,I have a dream&filenext.php后: ......不太行,好像得用filephp://filter/convert.base64-encode/resourcenext.php 耶?那 f…...
软考中级-数据库-3.3 数据结构-树
定义:树是n(n>=0)个结点的有限集合。当n=0时称为空树。在任一非空树中,有且仅有一个称为根的结点:其余结点可分为m(m>=0)个互不相交的有限集T1,T2,T3...,Tm…,其中每个集合又都是一棵树,并且称为根结点的子树。 树的相关概念 1、双亲、孩子和兄弟: 2、结点的度:一个结…...
磁盘空间不足|如何安全清理以释放磁盘空间(开源+节流)
背景: 最近往数据库里存的东西有点多,磁盘不够用 查看磁盘使用情况 df -h /dev/sda5(根目录 /) 已使用 92% 咱们来开源节流 目录 背景: 一、开源 二、节流 1.查找 大于 500MB 的文件: 1. Snap 缓存…...
SpringCloud系列教程(十二):网关配置动态路由
除了token以外,还有一个很实用的功能就是把网关的路由配置放到nacos上,并且修改路由配置的时候,网关服务可以动态的更新,这样我们在调整网络配置的时候,就不用重启服务了。所以我们需要用到两个重要的类:Na…...
Java-实现PDF合同模板填写内容并导出PDF文件
可用于公司用户合同导出pdf文件 效果图 一、导入所需要jar包 <!--生成PDF--><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version></dependency><dependency&…...
基于STM32的环境监测系统(自制蓝牙APP)
目录 项目概述 实物图 演示视频 概述 硬件模块 原理图以及PCB 0.96寸OLED屏幕(SSD1306) CubeMX配置 初始化代码 MQ-2烟雾传感器 CubeMX配置 初始化代码 DHT11温湿度模块 驱动代码 HC-05蓝牙模块 CubeMX配置 编辑 空闲中断回调函数 有…...
C++ Windows下屏幕截图
屏幕截图核心代码(如果要求高帧率,请使用DxGI): // RGB到YUV的转换公式 #define RGB_TO_Y(r, g, b) ((int)((0.299 * (r)) (0.587 * (g)) (0.114 * (b)))) #define RGB_TO_U(r, g, b) ((int)((-0.169 * (r)) - (0.331 * (g)) …...
月结保障:回滚慢、行锁频发
问题背景 3.1号月结现场保障,到场了先让kill了一个账务的会话,回滚了20min,巡检的时候发现报表库有几条行锁:enq: TX - row lock contention,sql:delete from table_name 语句已经失败,正在回滚…...
Golang的微服务服务发现机制
## 1. Golang微服务服务发现机制 微服务架构已经成为当今软件开发的主流趋势,它能将复杂的单体应用拆分成小而独立的服务单元,实现更快的开发、部署和扩展。在微服务架构中,服务发现是非常重要的一环,它能够实现服务之间的自动发现…...
Keepalived 入门详解:高可用集群部署最佳实践!
1. 什么是 Keepalived? 在分布式集群中,单点故障(SPOF) 是影响系统稳定性的重要问题。Keepalived 作为一款高可用服务软件,可以有效防止集群单点故障,保障系统的高可用性。 Keepalived 最初是为 LVS&#…...
SparkStreaming之04:调优
SparkStreaming调优 一 、要点 4.1 SparkStreaming运行原理 深入理解 4.2 调优策略 4.2.1 调整BlockReceiver的数量 案例演示: object MultiReceiverNetworkWordCount {def main(args: Array[String]) {val sparkConf new SparkConf().setAppName("Networ…...
开发博客系统
前言 准备工作 数据库表分为实体表和关系表 第一,建数据库表 然后导入前端页面 创建公共模块 就是统一返回值,异常那些东西 自己造一个自定义异常 普通类 mapper 获取全部博客 我们只需要返回id,title,content,us…...
微信小程序上如何使用图形验证码
1、php服务器生成图片验证码的代码片段如下: 注意红框部分的代码,生成的是ArrayBuffer类型的二进制图片 2、显示验证码 显示验证码,不要直接image组件加上src显示,那样拿不到cookie,没有办法做图形验证码的验证&…...
IntelliJ IDEA 构建项目时内存溢出问题
问题现象 在使用 IntelliJ IDEA 构建 Java 项目时,遇到了以下错误: java: java.lang.OutOfMemoryError: Java heap space java.lang.RuntimeException: java.lang.OutOfMemoryError: Java heap space这是一个典型的 Java 堆内存不足错误,表…...
大模型微调与RAG检索增强技术深度解析
一、引言 随着人工智能技术的飞速发展,大模型(如BERT、GPT等)在自然语言处理、计算机视觉等领域取得了显著成效。然而,这些预训练好的大模型往往难以直接应用于特定业务场景,因此,大模型微调(F…...
[liorf_localization_imuPreintegration-2] process has died
使用liorf,编译没报错,但是roslaunch报错如下: 解决方法: step1: 如果你之前没有安装 GTSAM,可以尝试安装它 step2: 检查是否缺少依赖库 ldd /home/zz/1210/devel/lib/liorf_localization/liorf_localization_imuPr…...
2024 年 MySQL 8.0.40 安装配置、Workbench汉化教程最简易(保姆级)
首先到官网上下载安装包:http://www.mysql.com 点击下载,拉到最下面,点击社区版下载 windows用户点击下面适用于windows的安装程序 点击下载,网络条件好可以点第一个,怕下着下着断了点第二个离线下载 双击下载好的安装…...
数列极限入门习题
数列极限入门习题 lim n → ∞ ( 1 1 2 1 3 ⋯ 1 n ) 1 n \lim\limits_{n\rightarrow\infty}(1 \frac{1}{2}\frac{1}{3}\cdots\frac{1}{n})^{\frac{1}{n}} n→∞lim(12131⋯n1)n1 lim n → ∞ ( 1 n 1 1 n 2 ⋯ 1 n n ) \lim\limits_{n\rightarrow\…...
【Python/Pytorch】-- 创建3090Ti显卡所需环境
文章目录 文章目录 01 服务器上,存在三个anaconda,如何选择合适的,创建python环境?02 conda、anaconda、cuda、cudnn区别03 用到一些指令04 如何指定cuda的版本?05 conda跟pip的区别?06 pycharm控制台07 服…...
如何在无图形化界面的服务器上下载百度网盘的超大文件(10GB以上)?
目录 登录百度网盘账号 进入特定的文件夹 下载 完整教程 登录百度网盘账号 第一次登录的时候会展示: Please visit: https://openapi.baidu.com/oauth/2.0/authorize?client_idxxx And authorize this app Paste the Authorization Code here within 10 minut…...
AI应用测试:遇到类ChatGPT的流式接口要如何压测?
先说结论: 使用最普遍的JMeter 就能支持类 OpenAI 的流式接口(如 ChatGPT 的流式聊天接口)的测试 总体设置 JMeter 支持测试 OpenAI 的流式接口,但需要额外配置(如启用 KeepAlive 和调整超时)。如果需要实时处理流式响应,使用 Regular Expression Extractor 或自定义脚…...
Linux磁盘情况查询
一、查询系统整体磁盘使用情况 1、基本语法 df -h 2、示例 二、查询指定目录的磁盘占用情况 1、基本语法 du -h 查询指定目录的磁盘占用情况,默认为当前目录 2、常用选项 选项 说明 -h 以人类可读的格式显示磁盘使用情况(例如,KB、…...
数据库原理3
1.在SQL中,外模式对应于试图(VIEW)和部分基本表;模式对应于基本表;内模式对应于存储文件。 2.FETCH:实施游标推进 3.数据操纵:insert,update,delete 数据控制:grant,revoke 数据定义:create,drop,alter 4.物理结构…...
