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就不看时间,直接执行
给第一条指令增加了