C语言程序makefile编译过程
C语言程序makefile编译过程
2022-0111 blog_010 makefile是一些大型linux下开发的项目经常会用到的编译脚本; 可以将makefile理解为类似shell一样的脚本语言,他也有自己的语法规则,注释,可以定义变量等;
下面通过一个简单的例子来看C语言程序的编译过程
- 准备一个linux系统,比如ubuntu
- 编辑一个C语言的源码文件,例如下面的main.c
#include <stdio.h> #define STR "abcdef" #define PRI printf int main(void) { PRI("%s ", STR); return 0; }
- linux命令终端执行:touch makefile 或者 touch Makefile 创建一个makefile文件
- 输入一下makefile内容
# this is a comment in makefile # 4 main : main.o gcc main.o -o main # 3 main.o : main.s gcc -c main.s -o main.o # 2 main.s : main.i gcc -S main.i -o main.s # 1 main.i : main.c gcc -E main.c -o main.i # make clean rules .PHONY : clean clean : rm main.i main.S main.o main
- linux命令终端执行:make,即可编译
- linux命令终端执行:./main,运行生成的目标文件,查看运行结果
- linux命令终端执行:ls, 即可查看make命令编译生成的文件
- 注意下顺序,如果倒过来1234,make的时候只会执行一句
C语言程序编译的过程: C/C++ 这样的属于高级编程语言,编译的方向是:
高级语言(工程师编写的代码)->汇编语言->机器语言(二进制文件)
那么现在回到上面的makefile:
- " # " 表示注释,多行注释可在当前行末尾加 " "
- makefile的一个语法格式: 目标文件 : 依赖文件 [Table]命令(注意命令前面必须有Table键值)
- .PHONY : clean 这里表示一个伪目标
- 调用make clean时,就会执行clean定义的命令:rm main.i main.S main.o main
下面终于进入正题,敲黑板环节
C语言程序的编译过程:
- 预处理 gcc -E main.c -o main.i
- 汇编 gcc -S main.i -o main.s
- 编译 gcc -c main.s -o main.o
- 链接 gcc main.o -o main
关于汇编和编译的理解(仅个人理解): 从文件的目标与依赖关系来看: 1. 预处理依赖.c文件,生成.i文件; 2. 汇编依赖.i文件,生成.s的汇编程序文件; 3. 目标.o文件,依赖于.s文件,将汇编程序编译成二进制.文件o的过程,称为编译 4. 链接二进制文件生成可执行文件
小发现 好像生成的.s汇编文件不需要依赖.i文件,也可以依赖.c文件生成汇编程序文件 如: gcc -S main.c -o main.s 这就尴尬了。。。