您的位置:

makefile教程

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