学习视频链接
黑马程序员-Linux系统编程_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1KE411q7ee?p=45&spm_id_from=pageDriver
目录
2.8 如果 makefile 文件名不叫 makefile
一、编译过程
1.1 基础知识
预处理:把 .h 和 .c 展开形成一个文件。直接替换 宏定义、头文件、库文件,生成 .i 文件
编译:.i 生成一个汇编代码文件 .s 文件
汇编:.s 生成一个 .o(.obj)文件
链接:.o 链接,windows 生成 .exe,linux 生成 .elf 文件
1.2 测试
C 语言编译器叫 gcc
C++ 编辑器叫 g++
1、 .h 、.c ——> .i
# 把 test.c 预处理成 hello.i
gcc -E test.c -o hello.i
生成了一个 700 行的预处理文件,其中大部分是前面导入的头文件
2、编译 汇编 链接
# 编译 汇编 链接
gcc -S hello.i -o hello.S
gcc -c hello.S -o hello.o
gcc hello.o -o hello
# 执行
./hello
3、编译的四个部分合成为一步
gcc test.c -o test
1000 个 .c 文件就很难去编译了,就需要使用 MakeFile 了。
二、脚本语言:MakeFile
2.1 为什么使用脚本语言 MakeFile
Linux C/C++ 必须要使用的一个编译脚本,只需要输入一个指令就能执行上述编译过程
2.2 简单的写法如下
1、案例1
# 是注释
# 第一层:显示规则
# 目标文件:依赖文件
# [tab]指令
test:test.o
gcc test.o -o test
test.o:test.S
gcc -c test.S -o test.o
test.S:test.i
gcc -S test.i -o test.S
test.i:test.c
gcc -E test.c -o test.i
2、完成编译以后,我们可以删除编译后的文件
# rm -rf test.o test.S test.i test
# 伪目标:.PHONY
.PHONY:
clear:
rm -rf test.o test.S test.i test
# 为目标的好处:文件夹中有与clear同名的文件,不会影响到clear的执行
可以只清除一部分:
.PHONY:
clearall:
rm -rf test.o test.S test.i test
clear:
rm -rf test.o test.S test.i
3、如果只修改了其中一个 .c 文件,执行 make 的时候只会重新编译修改了的那个 c 文件
4、案例2
文件夹中有以下六个文件
circle.c、circle.h、cube.o、cube.h、main.c、main.h
test:circle.o cube.o main.o
gcc circle.o cube.o main.o -o test
circle.o:circle.c
gcc -c circle.c -o circle.o
cube.o:cube.c
gcc -c cube.c -o cube.o
main.o:main.c
gcc -c main.c -o main.o
.PHONY:
clearall:
rm -rf circle.o cube.o main.o test
clear:
rm -rf circle.o cube.o main.o
减号 - 表示出错依然执行(作用是,删除不存在文件时,不报错。顺序执行结束)
2.3 变量
# 第一层:显示规则
# 目标文件:依赖文件
# [tab]指令
# 第二层:变量
# = (替换) += (追加) := (恒等于)
# 使用变量 $(变量名) 替换
TAR = test
OBJ = circle.o cube.o main.o
CC := gcc
$(TAR):$(OBJ)
$(CC) $(OBJ) -o $(TAR)
circle.o:circle.c
$(CC) -c circle.c -o circle.o
cube.o:cube.c
$(CC) -c cube.c -o cube.o
main.o:main.c
$(CC) -c main.c -o main.o
.PHONY:
clearall:
rm -rf $(OBJ) $(TAR)
clear:
rm -rf $(OBJ)
2.4 两个函数
用 src 替换所有 .c 文件
obj 为 src 中所有的 .c 替换为 .o 形成的一个字符串
2.5 自动变量:
$@:表示规则中的目标
$<:表示规则中的第一个条件
$^:表示规则中的所有条件,组成一个列表, 以空格隔开。如果将该变量应用在模式规则中,它可将依赖条件列表中的依赖依次取出,套用模式规则。
2.6 模式规则
现在可以方便拓展了
静态模式规则,指定生成 .out 的 .o 文件从加了 $(obj) 的文件里面去找
2.7 文件管理
2.8 如果 makefile 文件名不叫 makefile
可以使用:make -f 文件名
2.9 只编译一个文件
make xxx.c
三、补充
3.1 编译显示 / 关闭警告信息
显示所有警告信息 gcc hello.c -o hello -Wall
禁止所有警告信息 gcc hello.c -o hello -w
3.2 gcc 链接头文件
-I 头文件地址
3.3 编译、链接、装载
编译 .c —> .o
链接 小模块.o —> 大模块.exe
装载 .exe 放入内存中
3.4 模拟执行指令
防止误删源码
加上 -n