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

举报