makefile中%.o 和%.cpp的作用
时间: 2024-04-10 14:33:55 浏览: 145
在 Makefile 中,`%.o` 和 `%.cpp` 是通配符模式(Wildcard Pattern)。它们可以用于匹配多个文件名,并在规则中使用。
- `%.cpp`:表示匹配以 `.cpp` 结尾的任意文件名。例如,`main.cpp`、`utils.cpp` 等。
- `%.o`:表示匹配以 `.o` 结尾的任意文件名。例如,`main.o`、`utils.o` 等。
这些通配符模式常用于编译源代码文件时的规则定义。下面是一个示例:
```makefile
objects = main.o utils.o
all: program
program: $(objects)
g++ -o program $(objects)
%.o: %.cpp
g++ -c $< -o $@
```
在这个示例中,`objects` 变量包含了要编译的目标文件列表。`all` 目标依赖于 `program` 目标,而 `program` 目标又依赖于 `$(objects)` 中的目标文件。
规则 `%.o: %.cpp` 表示将以 `.cpp` 结尾的源代码文件编译为以 `.o` 结尾的目标文件。其中,`$<` 代表规则中的第一个依赖文件(即源代码文件),`$@` 代表规则中的目标文件(即目标文件名)。通过这样的规则定义,可以自动地根据源代码文件生成对应的目标文件。
使用通配符模式可以简化 Makefile 的书写,特别适用于大型项目中有多个源代码文件需要编译的情况。它可以自动匹配文件名,减少了手动编写每个文件的规则的工作量。
相关问题
SRC=$(wildcard *.cpp) OBJ=$(patsubst %.cpp, %.o,$(SRC))
这是一个 Makefile 中的语句,用于定义变量。其中:
- `SRC=$(wildcard *.cpp)` 表示将当前目录下所有的 `.cpp` 文件的文件名保存到 `SRC` 变量中,使用了 `wildcard` 函数。
- `OBJ=$(patsubst %.cpp, %.o,$(SRC))` 表示将 `SRC` 变量中的每个 `.cpp` 文件名替换成对应的 `.o` 文件名,并将结果保存到 `OBJ` 变量中,使用了 `patsubst` 函数。
举个例子,如果当前目录下有 `foo.cpp` 和 `bar.cpp` 两个文件,那么执行完上述语句后,`SRC` 变量的值为 `foo.cpp bar.cpp`,`OBJ` 变量的值为 `foo.o bar.o`。这样在后续的编译过程中,就可以方便地使用这两个变量来指定源文件和目标文件。
makefile中的.SUFFIXES
Makefile 中的 `.SUFFIXES` 是一个特殊行,它用于指定文件扩展名到其对应的构建规则的映射。当你在 Makefile 中声明了一个 `.SUFFIXES` 行,之后的每一对扩展名和目标规则都会添加到这个列表里。例如:
```makefile
.SUFFIXES: .cpp .o
.cpp.o:
$(CC) $(CFLAGS) -c $< -o $@
```
在这个例子中,`.SUFFIXES` 定义了两个关联:`.cpp` 文件将被转换成 `.o` 的目标,这意味着当你运行 `make` 时,对于所有 `.cpp` 源文件,系统会自动查找并应用这个规则。
有了这个设置,你无需每次列出完整的文件名(如 `main.cpp.o`),而是可以简写为 `main.cpp`,Make 就能根据 `.SUFFIXES` 自动完成构建过程。
阅读全文