makefile

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)第五层:函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

comli_cn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值