Makefile 入门笔记 | 常见函数 | 选项 | 命令
- 1. **什么是Makefile?**
- 2. **Makefile的基本结构是什么?**
- 3. **如何定义变量和使用变量?**
- 4. **如何编写规则和命令?**
- 5. **如何处理依赖关系?**
- 6. **如何调用子目录中的Makefile?**
- 7. **有哪些常见的Makefile函数?**
- 8. **有哪些常见的命令和选项?**
- 常见的`make`命令:
- 1.**`make`:**
- 2.**`make target`:**
- 3.**`make -f Makefile`:**
- 4.**`make -n`或`make --just-print`:**
- 5.**`make -B`或`make --always-make`:**
- 6.**`make clean`:**
- 常见的`make`选项:
- 1.**`-C directory`:**
- 2.**`-j N`:**
- 3.**`-k`或`--keep-going`:**
- 4.**`-s`或`--silent`:**
- 5.**`-r`或`--no-builtin-rules`:**
- 6.**`-d`或`--debug`:**
- 7.**`-w`或`--print-directory`:**
- 8.**`--version`:**
1. 什么是Makefile?
- Makefile是一个文本文件,其中包含了一系列规则,描述了源代码文件之间的依赖关系以及构建规则。Make工具使用Makefile来判断哪些文件需要重新编译,以及如何进行编译。
2. Makefile的基本结构是什么?
- Makefile由一系列规则组成,每个规则包含一个目标、依赖项和执行命令。目标是文件的名称,依赖项是构建目标所需的文件,而命令是构建目标的步骤。
3. 如何定义变量和使用变量?
- 可以使用
变量名 = 值
的语法定义变量,然后通过$(变量名)
来引用变量。例如:CC = gcc CFLAGS = -Wall target: dependency $(CC) $(CFLAGS) -o target source.c
4. 如何编写规则和命令?
- 规则由目标、依赖项和命令组成,例如:
其中,target: dependency command
target
是构建的目标文件,dependency
是目标文件的依赖项,command
是构建的实际命令。
5. 如何处理依赖关系?
- 使用规则中的依赖项来指定目标文件所依赖的其他文件,确保在构建目标之前,其依赖项已经构建完成。例如:
target: dependency1 dependency2 command
6. 如何调用子目录中的Makefile?
- 使用
make
命令的递归调用功能,例如:all: $(MAKE) -C subdir
在Makefile中,all
是一个常见的目标名称,它通常被用作默认目标。当你在命令行中运行make
而没有指定具体的目标时,Make工具会尝试构建默认目标,而通常这个默认目标就是all
。
例如,一个简单的Makefile可能包含如下内容:
all: target1 target2
target1:
command1
target2:
command2
在这个例子中,all
是默认目标,它依赖于target1
和target2
。当你在命令行中运行make
时,它将尝试构建all
,然后按照规则依次构建target1
和target2
。这样,通过将常用的目标放在all
中,可以方便地一次性构建整个项目或执行一系列任务。
你可以在Makefile中自定义all
目标,根据项目的需要添加相关的依赖项和命令。
7. 有哪些常见的Makefile函数?
- 一些常见的Makefile函数包括
wildcard
、foreach
等。例如:sources = $(wildcard *.c) objs = $(patsubst %.c, %.o, $(sources))
Makefile中有一些常见的函数,它们提供了在Makefile中进行文本处理和操作的能力。以下是一些常见的Makefile函数:
1.wildcard:
- 用于匹配文件名,返回符合模式的文件列表。例如:
sources = $(wildcard *.c)
2.patsubst:
- 用于替换字符串中的模式。通常用于将源文件列表转换为目标文件列表。例如:
objs = $(patsubst %.c, %.o, $(sources))
3.foreach:
- 用于在循环中处理元素。例如:
files = file1.c file2.c file3.c targets = $(foreach file, $(files), $(basename $(file)).o)
4.if:
- 用于在条件语句中执行不同的操作。例如:
debug = 1 ifdef debug CFLAGS += -g endif
5.shell:
- 用于在Makefile中执行Shell命令,并返回结果。例如:
date = $(shell date)
6.addprefix:
- 为列表中的每个元素添加前缀。例如:
sources = file1.c file2.c file3.c objs = $(addprefix obj_, $(sources))
7.subst:
- 用于替换字符串中的文本。例如:
message = Hello, World! result = $(subst World, Universe, $(message))
8.strip:
- 用于去除变量值中的空格。例如:
spaces = one two three stripped = $(strip $(spaces))
8. 有哪些常见的命令和选项?
- 常见的
make
命令包括make
、make clean
等。选项包括-C
用于指定工作目录,-f
用于指定Makefile文件等。
常见的make
命令:
1.make
:
- 执行默认目标(通常是
all
)进行构建。
2.make target
:
- 指定构建特定的目标。例如,
make clean
用于清理生成的文件。
3.make -f Makefile
:
- 指定使用名为
Makefile
的文件进行构建,而不使用默认的Makefile
文件。
4.make -n
或make --just-print
:
- 打印构建过程中将要执行的命令,但不真正执行它们。
5.make -B
或make --always-make
:
- 强制重新构建所有目标,而不考虑它们的时间戳。
6.make clean
:
- 执行清理操作,通常删除生成的目标文件和可执行文件,以及其他临时文件。
常见的make
选项:
1.-C directory
:
- 指定
make
在执行之前进入directory
目录。
2.-j N
:
- 指定并行构建的任务数量。例如,
make -j4
表示同时执行4个任务。
3.-k
或--keep-going
:
- 即使某个目标构建失败,也继续构建其他目标。
4.-s
或--silent
:
- 使
make
运行在安静模式,减少输出信息。
5.-r
或--no-builtin-rules
:
- 禁用内置规则,只使用自定义的规则。
6.-d
或--debug
:
- 输出详细的调试信息,用于排查构建问题。
7.-w
或--print-directory
:
- 在构建时显示当前工作目录的名称。
8.--version
:
- 显示
make
的版本信息。
这只是一些常见的make
命令和选项,实际上还有更多的选项可以根据具体的需求使用。你可以通过运行man make
或查阅相关文档来获取更详细的信息。