Linux编辑器gcc/g++的使用以及Makefile的用法

embedded/2024/10/18 18:13:55/

gcc如何完成

格式 gcc [选项] 要编译的文件 [选项] [目标文件]

gcc对code.c编译形成可执行文件mybin,十分推荐直接这样写,下面会有拆分写法(不推荐)

gcc与我们使用过的编辑器无二,都需要经过

1. 预处理(进行宏替换)
2. 编译(生成汇编)
3. 汇编(生成机器可识别代码)
4. 连接(生成可执行文件或库文件)

这几个阶段,简单说一下各个阶段的作用

预处理(进行宏替换)
预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
预处理指令是以#号开头的代码行。

选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。

编译(生成汇编)
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。

用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码

汇编(生成机器可识别代码)
汇编阶段是把编译阶段生成的“.s”文件转成目标文件。

读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了

连接(生成可执行文件或库文件)
在成功编译之后,就进入了链接阶段。

Makefile(自动化构建代码)

可以增加效率

基本使用

首先需要手动创建一个Makefile的文本文件

使用vim 对其进行编译

这里mybin依赖于code.c

因为gcc这条指令是Makefile里第一条指令,所以使用时只需要make就可执行

可以看到打出make直接就执行了第一条指令

我们继续定义第二条指令

可以看到我们执行第二条指令需要在make 后加上clean

同时我们发现第二条指令上面有一个红色的.PHONY(最后有详细讲解)

如果要用到.PHONY我们先看一个示例:

连续两次make,第二次make失败了

我们需要知道:

make 与 Make 不会对老文件重新编译,而新文件则重新编译,通过对比更改时间来判断的。

stat可以查看文件的ACM三个时间

变量替换和隐藏回显

Makefile是支持变量替换的

这里和我们c语言里面的宏替换很像,以图为例后续使用就可以用cc来代替g++

可以写成这样

还有一个便捷的变量替换:

$^代表依赖关系冒号右侧所有内容

$@代表依赖关系左侧形成的目标文件

同时还看到我还使用了@,它的作用是什么?

这里看到,明显我不想让打印的命令打印出来

加了@之后就和我预想的效果是一样的了:

.PHONY

接下来详细介绍.PHONY:

.PHONY 是 Makefile 中的一个特殊目标,用于声明一个伪目标(phony target)。伪目标是指在文件系统中并不存在对应的文件名,而是由 Makefile 中的规则和命令来执行的目标。依赖方法总是会被执行,不会被任何情况拦截。

简单来说,加了.PHONY后gcc就不看时间,直接执行

给第一条指令增加了


http://www.ppmy.cn/embedded/6121.html

相关文章

Spark/SparkSQL读取Hadoop LZO文件概述

一、前置配置 IDEA Maven安装配置 Scala(可选) Java Hadoop.dll(可能需要,具体看有无相关错误信息) hadoop-lzo-0.xx.xx.jar(如果你的版本过高,需要到官网下载高版本,mvnrepository仓…

文心一言 vs GPT-4 —— 全面横向比较

比较文心一言和 GPT-4 时,需要考虑它们的特点、优缺点以及适用场景。以下是它们的全面横向比较: 文心一言 特点: 基于预定义的模板和规则,生成简短的句子,通常为一句话。 主要用于生成文案、情话、格言等短文本内容。…

QT中的OpenGL学习------向量

一、线性代数知识 1.1 向量的点乘与叉乘 1.2 矩阵 1.3 旋转、缩放、位移 二、代码实现 #include "openglwidget.h"unsigned int VBO, VAO, EBO; float ratio 0.5; float vertices[] {//positions //colors //texture coordinates0.3f, 0.3f, 0.0f, 1.0f, 0.0f, 0…

npm常用命令详解(二)

npm(Node Package Manager)是Node.js的包管理器,它允许你安装、共享和管理Node.js代码库。以下是一些常用的npm命令及其详解,以帮助您更好地理解和使用它。 1. npm doc 功能:查看指定包的文档。 语法:np…

探索MongoDB:灵活、高性能的NoSQL数据库解决方案与应用实践

MongoDB是一种NoSQL数据库,采用文档型数据模型,适合存储和处理非结构化或半结构化的数据。它具有高度的灵活性和可扩展性,被广泛应用于Web应用、大数据分析、物联网和实时数据处理等领域。 MongoDB主要特点 1. 文档存储 MongoDB采用文档型…

QT-输入输出

C 中的输入和输出(I/O)主要是通过标准库中的输入输出流来实现的。最常用的是 iostream 库,它 提供了用于输入和输出的基本流类,包括cin,cout,cerr和clog。 1.标准输出流 ( cout ) cout 代表标…

缓存之SpringCache整合redis

Spring Cache 是 Spring 框架提供的一种缓存抽象,在应用中可以方便地使用它来进行方法级别的缓存。结合 Redis 作为缓存存储后端,可以实现高性能的缓存服务。下面是一个简单的示例,演示了如何在 Spring Boot 项目中整合 Spring Cache 和 Redi…

《设计模式之美》第三章 总结

《设计模式之美》总结 第三章 设计原则 3.1 单一职责原则:如何判定某个类的职责是否单一 3.1.1 单一职责原则的定义和解读 定义:一个类或模块只负责完成一个职责(功能) 含义:不要设计功能大而全的类或模块&#xff…