带你掌握Linux项目自动化构建工具Makefile make

用于指导make命令如何生成目标文件(target)。第一个规则表示如何生成main.o这个目标文件。第二个规则表示如何生成program这个目标文件。

在软件开发中,构建是一个非常重要的环节。随着软件规模越来越大,手动构建已经无法满足需求了。因此,自动化构建成为了一种必要的选择。在Linux中,Makefile和make是两个最常用的自动化构建工具。本文将带你深入了解Makefile和make,并教你如何使用它们进行项目自动化构建。

什么是Makefile

Makefile是一个文本文件,其中包含了一系列规则(rules),用于指导make命令如何生成目标文件(target)。每个规则由三部分组成:目标文件、依赖关系和命令行。

目标文件指的是需要生成的文件;依赖关系指的是生成该目标文件所需要依赖的其他文件;命令行则指定了如何生成该目标文件。

举个例子:

“`

main.o: main.c header.h

gcc -c main.c

program: main.o file.o

gcc -o program main.o file.o

上述代码定义了两个规则。第一个规则表示如何生成main.o这个目标文件。它依赖于main.c和header.h这两个源码文件,并执行gcc -c main.c这条命令来生成该目标文件。

第二个规则表示如何生成program这个目标文件。它依赖于main.o和file.o这两个目标文件,并执行gcc -o program main.o file.o这条命令来生成该目标文件。

什么是make

make是一个命令行工具,用于根据Makefile中的规则自动化构建项目。通过运行make命令,它会自动检查每个目标文件是否需要重新生成,并根据依赖关系确定构建顺序。

假设我们有一个名为program的可执行文件需要构建。如果我们在Makefile中定义了如下规则:

program: main.c file.c

gcc -o program main.c file.c

那么我们只需要在终端中输入以下命令即可完成项目的自动化构建:

$ make

make会自动检查main.c和file.c是否被修改过,如果没有,则直接使用已经存在的object files进行链接操作;否则,重新编译源代码并链接成新的可执行程序。

如何编写Makefile

现在让我们来看一下如何编写Makefile。

首先,在当前工程根目录创建一个名为Makefile(或者makefile)的文本文件。然后,在其中添加所需的规则即可开始配置项目构建流程。

比如说,我们有以下源码和头文件:

带你掌握Linux项目自动化构建工具Makefile make

src/

├── main.cpp

└── utils.cpp

include/

└── utils.h

我们的目标是生成一个名为program的可执行文件。根据依赖关系,我们需要先编译main.cpp和utils.cpp这两个源码文件,然后将它们链接起来生成一个可执行文件。

因此,我们需要在Makefile中定义以下规则:

CC=g++

CFLAGS=-I./include

SRCS=$(wildcard ./src/*.cpp)

OBJS=$(patsubst %.cpp,%.o,$(SRCS))

all: program

program: $(OBJS)

$(CC) -o $@ $^

$(OBJS): %.o : %.cpp

$(CC) -c $(CFLAGS) $< -o $@

上述代码中,我们首先定义了两个变量:CC表示使用g++编译器进行编译;CFLAGS表示头文件所在的路径。

接着,我们使用wildcard和patsubst函数获取所有源码文件,并将它们转换为对应的目标文件。其中,“%”符号表示通配符。

最后,在all规则中指定了程序入口,并在program规则中指定了如何生成可执行程序。$(OBJS)表示所有目标文件;$@和$^分别代表当前规则所对应的目标和依赖项。

Makefile和make是Linux下最常用的自动化构建工具之一。通过Makefile可以定义项目构建流程,而make命令可以自动化地完成项目构建过程。掌握这两个工具能够大大提高软件开发效率,尤其是在大型项目中。

希望本文能够帮助你更好地了解和使用Makefile和make。如果有任何疑问或建议,欢迎留言讨论。