
gcc [选项] 要编译的文件 [选项] [目标文件]GCC/G++ 将源代码转换为可执行文件的过程分为四个阶段:
.i 文件):gcc -E mycode.c -o mycode.i-E:仅执行预处理。-o:指定输出文件名.s 汇编文件):将预处理后的代码转换为汇编语言。gcc -S mycode.i -o mycode.s-S:编译到汇编语言(不汇编、不链接) .o 目标文件):将汇编代码转换为机器码。gcc -c mycode.s -o mycode.o-c:编译到目标文件(机器码,未链接)。注意:目标文件.o不可以独立执行,尽管他已经是二进制文件了。
💡:记忆小技巧:
我们都知道,头文件.h中提供的是方法声明。那么,真正的方法在哪里呢? 没错,就是在库中: 头文件 + 库 + 你的代码 = 你的软件
库:经过一定的翻译,然后打包的源文件。
为什么要翻译打包?
从这两种链接的原理我们可以发现:
注意:在Linux中,默认的链接方式是动态链接
如果需要静态链接的方式,使用选项-static来提供静态库:
gcc mycode.c -o mytest -static其实-static的本质就是改变优先级
💡:
动态库:
静态库:
基本规则结构
target: dependencies # 目标对象与依赖对象(依赖关系)
[tab] command # 依赖方法必须以 Tab 开头(非空格)示例:编译 hello.c 生成可执行文件 hello
hello: hello.c # 目标:hello,依赖:hello.c
gcc hello.c -o hello # 命令:编译命令我们来输入以下内容:

结果:

可以发现:makefile的编译顺序与我们书写的顺序是无关的,它会按照我们书写的第一个目标文件为目标,自动化推导出正确的顺序,生成目标文件。
makefile以第一个目标文件为默认目标文件,使用时只需make即可。其余目标文件使用时均需要make+[目标文件]


现在我们只需要输入make,就可以完成编译生成可执行程序了。
但当我们再次输入make,却报错了,为什么呢?

.PHONY:伪目标怎么做到的呢? make会根据源文件和目标文件的新旧,判定是否需要重新执行依赖关系进行编译。 只有可执行文件的修改时间比源文件老,才会重新编译。
所以,依赖关系不一定总是执行的!
若是想让依赖关系总是执行,可以使用.PHONY:伪目标
.PHONY:让make忽略源文件和可执行目标文件的时间对比
.PHONY:伪目标一般用作项目清理:

这样我们只需要输入make clean,就可以快速完成项目清理了。

记忆小技巧💡:ACM时间
连锁反应:修改Modify,Change也会改变(文件大小变化)
touch + [已存在的文件],更新时间
如果不加选项,就会更新ACM时间
选项:常用自动变量:
$@目标文件名$^依赖文件名依据依赖关系自动匹配 示例:

另外,@+依赖方法可以取消回显