0. 手动编译
g++ sub_list.cpp -o sub_list.o
然后运行sub_list.o
./sub_list.o
选择C++11进行编译
g++ -std=c++11 match.cpp -o match.o
1. 几个过程
-E 预处理:把.h和.c展开形成一个文件,宏定义直接替换头文件和库文件
gcc -E hello.c -o hello.i
-S 汇编:.i 生成一个汇编代码文件 .s
gcc -S hello.i -o hello.S
-c 编译:.S生成一个.o .obj
gcc -C hello.S -o hello.o
-o 链接: .o 链接 .exe windows .elf
gcc hello.o -o hello
2. 最原始的编写makefile
(1) 创建文本文档,取名Makefile
(2) #是注释
写一个makefile来编译hello.c:
#目标文件:依赖文件
#[TAB]指令
#
#第一个目标文件是我的最终目标!!! 递归
#
#rm -rf hello.o hello.S hello.i hello
#伪目标:.PHONY
hello:hello.o
gcc hello.o -o hello
hello.o:hello.S
gcc -c gello.S -o hello.o
hello.S:hello.i
g++ -E hello.i -o hello.S
hello.i:hello.c
g++ -E hello.c -o hello.i
.PHONY:
clear: #clear是自己定的,也可以取别的名字
rm -rf hello.o hello.S hello.i hello
#在命令行使用make clear指令可以清除上面列举的文件
3. makefile进阶
同一个文件夹下面有:circle.c | circle.h | cube.c | cube.h | main.c | main.h 六个文件要进行编译
(1)第一层:显示规则
# circle.c circle.h cube.c cube.h main.c main.h
# 最终是想要得到可执行文件 test 省去了预编译 汇编
test:circle.o cub.o main.o
gcc circle.o cub.o main.o -o test
circle.o:circle.c
gcc -c circle.c -o circle.o
cub.o:cub.c
gcc -c cub.c -o cub.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)第二层:
变量 = (替换)
+= (追加)
:= (常量)
使用变量 $(变量名) 替换
# circle.c circle.h cube.c cube.h main.c main.h
# 最终是想要得到可执行文件 test 省去了预编译 汇编
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
cub.o:cub.c
$(CC) -c cub.c -o cub.o
main.o:main.c
$(CC) -c main.c -o main.o
.PHONY:
clearall:
rm -rf $(OBJ) $(TAR)
clear:
rm -rf $(OBJ)
(3)第三层:隐含规则
#第三层:隐含规则 %.c %.o 任意的.c 或者.o
# *.c *.o 所有的.c .o
TAR = test
OBJ = circle.o cube.o main.o
CC := gcc
$(TAR):$(OBJ)
$(CC) $(OBJ) -o $(TAR)
%.o:%.c
$(CC) -c %.c -o %.o
.PHONY:
clearall:
rm -rf $(OBJ) $(TAR)
clear:
rm -rf $(OBJ)
(4)第四层:通配符
#第四层:通配符 $^ 所有的依赖文件
# $@ 所有的目标文件
# $< 所有依赖文件的第一个文件
# $* 不包含扩展名的目标文件名称
# $+ 所有的依赖文件,以空格分开,并以出现的先后为序,
# 可能包含重复的依赖文件
# $? 所有时间戳比目标文件晚的依赖文件,并以空格分开
TAR = test
OBJ = circle.o cube.o main.o
CC := gcc
RMRF := rm -rf
$(TAR):$(OBJ)
$(CC) $^ -o $@
%.o:%.c
$(CC) -c $@ -o $^
.PHONY:
clearall:
$(RMRF) $(OBJ) $(TAR)
clear:
$(RMRF) $(OBJ)
(5)第五层:函数