Makefile是用于自动化构建的工具,由一个Makefile文件指定了构建需要执行的指令和规则。在软件开发中,使用make自动进行编译和构建,可以解决因代码修改而需要手动编译的问题,提高效率和团队协作。
一、Makefile基本语法
1、Makefile文件命名为Makefile或makefile。 2、Makefile由一系列规则组成,每个规则由三部分组成:目标、依赖和命令。比如:
target: dep1 dep2 ...
command1
command2
其中,目标表示规则要生成的文件,可以是Object文件、可执行文件、库文件等;依赖表示生成目标文件所需要的文件,可以是源文件、头文件等;命令表示生成目标文件所需要执行的命令。如果依赖文件或命令发生变化,则重新执行该规则。
3、Makefile支持注释,使用#
号开头。如:
# This is a comment
target: dep1 dep2 ...
command1 # This is also a comment
二、Makefile变量
1、Makefile支持变量,使用:=
、=
或?=
进行赋值。:=
表示立即展开,=
表示延迟展开,?=
表示仅在未定义时进行赋值。
VAR := value
2、变量还可以定义为可选,如:
VAR ?= default_value
如果VAR未定义,则赋值为default_value
。
3、还可以使用自动变量,如$@
表示生成目标文件名,$<
表示依赖文件的第一个文件名。
三、Makefile条件语句
1、Makefile支持条件语句,如if
、else
、endif
等。
ifeq ($(OS),Windows_NT)
# Windows specific commands
else
# Linux specific commands
endif
2、还可以使用函数进行条件判断,如ifeq
、ifneq
、ifdef
、ifndef
等。
ifdef VAR
# VAR exists
else
# VAR does not exist
endif
四、Makefile模式规则
1、Makefile支持通配符进行模式匹配,如%
表示任意字符序列。
%.o: %.c
cc -c $< -o $@
可以将源文件的编译生成目标文件和链接到可执行程序压缩到一行。
2、还可以使用多个通配符进行匹配,如**/*.c
表示可以匹配任何目录下的.c
文件。
五、例子
下面是一个Makefile的例子:
CC := gcc
CFLAGS := -Wall -g
SRCS := $(wildcard *.c)
OBJS := $(patsubst %.c,%.o,$(SRCS))
target: $(OBJS)
$(CC) -o target $(OBJS)
$(OBJS): %.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(OBJS) target
上述Makefile的含义为:
1、使用gcc
编译器。
2、定义生成Object文件所需的编译选项。
3、使用wildcard
找到当前目录下的所有.c
文件,使用patsubst
将.c
替换为.o
得到所有Object文件的依赖项。
4、生成目标target
可执行程序,依赖于所有Object文件,编译时使用CC
编译器,链接时省略。
5、为每个.c
文件生成一个对应的Object文件,编译时使用CC
编译器,依赖于对应的.c
文件和CFLAGS
选项。
6、定义一个clean
规则,用于删除所有Object文件和target
可执行程序。
结论
Makefile是构建工具中的重要组成部分,通过Makefile可以实现代码自动编译、构建和测试。本文介绍了Makefile的基本语法、变量、条件语句和模式规则,并给出了一个实例来展示如何使用Makefile进行项目构建。