带你掌握Linux项目自动化构建工具Makefile make
用于指导make命令如何生成目标文件(target)。第一个规则表示如何生成main.o这个目标文件。第二个规则表示如何生成program这个目标文件。
- 本文目录导读:
- 1、什么是Makefile
- 2、什么是make
- 3、如何编写Makefile
在软件开发中,构建是一个非常重要的环节。随着软件规模越来越大,手动构建已经无法满足需求了。因此,自动化构建成为了一种必要的选择。在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缩略图 带你掌握Linux项目自动化构建工具Makefile make](https://www.72715.net/wp-content/uploads/2023/05/b33503855d43279998ae9488856898c9.png)
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。如果有任何疑问或建议,欢迎留言讨论。