- Makefile,由复杂到简的优化
一、基础
创建名字为 Makefile 的文件,输入make默认执行第一个目标,可带参数指定执行哪些目标如make clean
CC 编译器名字 | 约定成俗 gcc g++等 |
CFLAGS 用到的参数 -c -g -Wall -o | 选择性追加 -c -g -Wall等 只激活编译前三步,不把*.o链接成一个文件 生成一个debug模式的可执行文件 开启:显示所有的警告信息 指定生成目标文件名字,-o 后必须紧跟名字 |
.PHONY | 隐式目标声明,用来避免目标名和生成文件名重复,导致目标无法执行 |
编译四步:
预处理,生成.i文件 |
编译,将处理后的文件转化为汇编语言.s文件 |
汇编,将.s文件生成为 机器码文件 .o (可以是单个的,最后再连接一起) |
连接,.o文件连接成可执行程序 |
二、完整
CC=gcc
CFLAG=-c -g -Wall
OBJS=main.o add.o swap.o
target:$(OBJS)
$(CC) $(CFLAG) -o endfile
main.o:main.c
$(CC) $(CFLAG) main.c -o main.o
add.o:add.c
$(CC) $(CFLAG) add.c -o add.o
swap.o:swap.c
$(CC) $(CFLAG) swap.c -o swap.o
.PHONY:clean
clean:
rm *.o endfile -f
三、精简
$^ | 所有不重复的依赖项 |
$< | 第一个依赖项 |
$@ | 目标名 的变量 |
目标项:依赖性 target:$(OBJS) target 是 目标项,:后面的就是依赖项 |
CC=gcc
# 参数按需添加
CFLAG=-c -g -Wall -o
# 一般添加什么文件在其后写入即可
OBJS=main.o add.o swap.o
# 依赖$(OBJS)里的.o文件生成目标文件
target:$(OBJS)
#即 gcc main.o add.o swap.o -o target
$(CC) $^ -o $@
# :<<'标识符' 标识符 这是多行注释,效果不如 单行# ,''最好加上
:<<'EOF'
main.o:main.c
$(CC) $(CFLAG) $@ $<
add.o:add.c
$(CC) $(CFLAG) $@ $<
swap.o:swap.c
$(CC) $(CFLAG) $@ $<
EOF
# 上几行可简化为
%.o:%.c
$(CC) $(CFLAG) $@ $<
.PHONY:clean
clean:
rm *.o target -f
常这么用:
CC=gcc
CFLAG=-c -g -Wall -o
OBJS=main.o add.o swap.o sul.o
target:$(OBJS)
$(CC) $^ -o $@
%.o:%.c
$(CC) $(CFLAG) $@ $<
.PHONY:clean
clean:
rm *.o target -f