本文主要展示Makefile的基本要素和示例,让读者可以快速写出一个实用的Makefile。
简要说明
Makefile,GNU make命令工具。
- 书写格式
<target> : <prerequisites>
[tab] <commands>
<target> 文件名或某操作的名字(伪目标phony target);
<prerequisites> 通常为一组文件名,用空格间隔;
<commands> 一行或多行shell命令;
[tab]键可以用.RECIPEPREFIX变量替换成其它字符;
每行命令各自在不同的shell中执行。同一行可以用分号间隔多个命令,用反斜杠\转义换行。
- 赋值与变量
赋值的几种方式:
= 延时,被使用时才展开定义
≔ 定义即生效
?= 该变量为空时设置值
+= 追加
内置变量:CC、AR、RM
自动变量:
$^ 所有的依赖文件
$@ 所有的目标文件
$< 第一个依赖文件
$* 通配符%通配的部分
Makefile示例
#This is a simple Makefile example
CC = gcc
CFLAGS = -I./include/
CFLAGS += -Wall -Werror
CODE_VER := 1.0
CFLAGS += -DTEST_ENABLE
CFLAGS += -DTEST_VER="\"$(CODE_VER)\""
LDDIR = -L./lib/
LDFLAGS = -ldl
BIN_NAME:=simple_test
OBJS = $(BIN_NAME).o
all:$(BIN_NAME)
$(BIN_NAME):$(OBJS)
$(CC) -o $@ $^ $(LDDIR) $(LDFLAGS)
.PHONY: clean
clean:
rm -rf $(OBJS) $(BIN_NAME)
上面只有一个.c文件的情况,其实只要键入gcc命令(示例如下)就可以编译生成可执行文件。
gcc -o simple_test simple_test.c
但是对于有多个文件目录的代码工程,Makefile就会让编译更高效。
从上面的图片中,可以看到CFLAGS变量是-c编译参数,该变量通过-I指定头文件的路径信息,-D向.c和.h文件传递参数。LDFLAGS变量是-o链接参数,可以链接需要用到的动态库。另外Makefile通过-L指定所需链接的动态库路径。
本Makefile示例中有一句".PHONY: clean",声明伪目标,避免该工作目录下有名称为clean的文件而使得make命令报错,例如提示"make: `clean' is up to date."