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

ops/2024/11/14 14:59:30/

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/ops/5808.html

相关文章

UE4_动画基础_动画重定位原理

动画重定位 是一种允许在共用相同骨架资源但比例差异很大的角色之间复用动画的功能。通过重定位,可以防止生成动画的骨架在使用来自不同外形的角色的动画时丢失比例或产生不必要的变形。 通过动画重定位,还可以在使用 不同骨架 资源的角色之间共享动画&a…

【LeetCode热题100】【图论】实现 Trie (前缀树)

题目链接:208. 实现 Trie (前缀树) - 力扣(LeetCode) 这应该和图论没啥关系,应该属于哈希和树,题目没讲前缀树到达是啥 前缀树是如何做到高效查找字符串的呢,先说单词查找树吧,一共就只有26个…

Docker Desktop 卡死在 “Starting the Docker Engine“问题解决

docker desktop启动卡死在这个界面长时间没有反应 wsl --status输入以上命令查看wsl状态,发现也是卡死的状态,长时间没有反应,猜测是因为WSL卡死导致的docker desktop卡死的 netsh winsock reset通过以上命令重置 重启电脑后问题解决

《量化投资以Python为工具》目录

《量化投资以Python为工具》 获取链接:《量化投资以Python为工具》 更多技术书籍:技术书籍分享,前端、后端、大数据、AI、人工智能... ​ ​ ​ ​

大数据:【学习笔记系列】Flink 中的 DataStream API 和 DataSet API

Apache Flink 提供了两种主要的数据处理API:DataStream API 和 DataSet API,这两种API分别针对不同的数据处理场景设计。以下是对这两种API的详细介绍: DataSet API 概述: DataSet API 是 Flink 的一个批处理API,用于…

一、pwn - 零基础ROP之Android ARM 32位篇(新修订,精华篇)

一、环境搭建 安装ndk r10e,必须得这个版本,其他版本可能导致 -fno-stack-protector 不生效! r10e Darwin: https://dl.google.com/android/repository/android-ndk-r10e-darwin-x86_64.zipLinux: https://dl.google.com/android/repository/android-ndk-r10e-linux-x86_6…

CCIE-16-PIM

目录 实验条件网络拓朴实验环境实验目的 开始实验实验1:PIM-DM配置PIM域中的路由,开启PIM-DM组播路由功能,验证组播情况 实验2:PIM-SM(静态RP)配置PIM域中的路由,开启PIM-SM组播路由功能&#x…

Git ignore、exclude for TortoiseGit 小结

1.Ignore Type:忽略类型,也即忽略规则,如何去忽略文件? 1.1.Ignore item(s) only in containing folder(s):仅忽略在包含在文件夹中项目。 仅忽略该文件夹下选定的patterns。the patterns其实就是文件类型,比如.txt后…