Makefile实践
Make是一种编译管理器,根据文件的时间戳自动检查出有更新的文件进行编译,只编译有改动的代码,不需要全部编译。
1.单个目录的情况

单个C文件
上图中展示了2种方法:
(1)
test:test.o
gcc test.o -o test
test.o:test.c test.h
gcc -c test.c -o test.o
(2)
OBJS1 := test.o #用户自定义变量1,代表.o文件
OBJS2 := test.c test.h #用户自定义变量2,代表源码文件
CC := gcc #预定义变量,指定编译器
TARGET :=test #用户自定义变量3,代表最终可执行程序名称
$(TARGET):$(OBJS1) #生成可执行程序依赖的目标文件
$(CC) $^ -o $@ #将所有的.o文件链接起来,生成可执行程序
@echo mytarge:$@ #打印信息,便于调试
$(OBJS1):$(OBJS2) #由.c和.h生成.o文件
$(CC) -c lt; -o $@ #编译test.c生成test.o
@echo mytarge:$@ #打印信息,便于调试
.PHONY:clean #.PHONY是一个伪目标,防止在Makefile中定义的只执行命令的目标和工作目录下的实际文件出现名字冲突
clean:
rm *.o $(TARGET) #清除所有的.o和可执行程序
$@:表示目标文件的完整名称
$^:表示所有不重复的目标依赖文件,以空格隔开
lt;:表示第一个依赖文件名称
$*:不包含扩展名的目标文件名称
$+:所有的依赖文件,以空格隔开,以出现的先后顺序,包含重复的依赖文件
@echo 相当于C语言中printf的功能
-c 只编译不链接,生成.o文件
make -C dir 读入指定目录中的Makefile
make -f file 读入当前目录中的file作为Makefile
make -s 在执行命令时不显示命令
make -i 所有的命令执行有误
make -I dir 指定被包含的Makefile的目录
make -n 只打印要执行的命令,但不执行这些命令
Makefile的格式:
目标:依赖的文件
Tab 命令
test:test.o
gcc test.o -o test
2.多个目录的情况
顶级Makefile
CC :=gcc
SUBDIR = test1\
test2\
src\
obj
OBJS = test1.o test2.o main.o
APP = app
OBJ = obj
BIN = bin
export CC OBJS APP OBJ BIN
all : CHECK_DIR $(SUBDIR)
CHECK_DIR:
mkdir -p $(BIN)
$(SUBDIR):ECHO
make -C $@
ECHO:
@echo $(SUBDIR)
@echo begin compile
clean:
@$(RM) $(OBJ)/*.o
@rm -rf $(BIN)

目录结构

编译
运行结果:
root@ubuntu-virtual-machine:/home/ubuntu/titok/makefileproj/multifile# ./bin/app
this is first test
this is second test