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进行项目构建。