make 在未指定的情况下用于构建目标文件的自动规则是什么?
What are the automatic rules make is using to build objects files without being specified?
我有一个旧项目,在一个目录中有几个 C++ 源文件和头文件,这些文件是使用 GCC 和 makefile 在 cygwin 中构建的。在编辑 makefile 以将所有临时文件和输出文件移动到子目录时,构建目标文件的规则没有任何效果。
$(BIN): $(OBJ)
$(CXX) $(LDFLAGS) -o $(BIN) $^
%.o: %.c
$(CXX) $(INC) $(CXXFLAGS) $@ -c -o $<
以下 makefile 仍然构建输出二进制文件,但没有任何从源代码构建目标文件的规则。
INC=-I.
CXX=g++
CXXFLAGS=-std=c++11 -Wall -Wextra -Wconversion -pedantic -O2 -g
LDFLAGS=
CLEAN_FILES=*.o *.out *.stackdump *.exe *.gcno *.gcda
BIN=app
SRC=$(wildcard *.cpp)
OBJ=$(SRC:%.cpp=%.o)
all: $(BIN)
$(BIN): $(OBJ)
.PHONY: clean
clean:
rm -f $(CLEAN_FILES)
这种自动行为叫什么?
无需您定义即可了解的规则集称为 built-in rules。手册列出了其中的大部分,但不是全部。您可以 运行 make -p -f/dev/null
查看所有这些列表。
关于内置规则的两个注意事项:
在大型项目中(它们将有自己的编译、链接等所有者规则......),从没有内置规则开始可能更容易(make -r
或 make --no-builtin-rules
).
许多内置规则都有挂钩,通过变量允许更改配置。例如:
%.o: %.c:
$(COMPILE.c) $(OUTPUT_OPTION) $<
...
COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
可以通过修改 "CFLAGS"、"CPPFLAGS" 等来自定义命令。常见的例子是 make "CFLAGS=-O -g"
以获得优化的调试程序,而无需重新定义所有规则。
我有一个旧项目,在一个目录中有几个 C++ 源文件和头文件,这些文件是使用 GCC 和 makefile 在 cygwin 中构建的。在编辑 makefile 以将所有临时文件和输出文件移动到子目录时,构建目标文件的规则没有任何效果。
$(BIN): $(OBJ)
$(CXX) $(LDFLAGS) -o $(BIN) $^
%.o: %.c
$(CXX) $(INC) $(CXXFLAGS) $@ -c -o $<
以下 makefile 仍然构建输出二进制文件,但没有任何从源代码构建目标文件的规则。
INC=-I.
CXX=g++
CXXFLAGS=-std=c++11 -Wall -Wextra -Wconversion -pedantic -O2 -g
LDFLAGS=
CLEAN_FILES=*.o *.out *.stackdump *.exe *.gcno *.gcda
BIN=app
SRC=$(wildcard *.cpp)
OBJ=$(SRC:%.cpp=%.o)
all: $(BIN)
$(BIN): $(OBJ)
.PHONY: clean
clean:
rm -f $(CLEAN_FILES)
这种自动行为叫什么?
无需您定义即可了解的规则集称为 built-in rules。手册列出了其中的大部分,但不是全部。您可以 运行 make -p -f/dev/null
查看所有这些列表。
关于内置规则的两个注意事项:
在大型项目中(它们将有自己的编译、链接等所有者规则......),从没有内置规则开始可能更容易(make -r
或 make --no-builtin-rules
).
许多内置规则都有挂钩,通过变量允许更改配置。例如:
%.o: %.c:
$(COMPILE.c) $(OUTPUT_OPTION) $<
...
COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
可以通过修改 "CFLAGS"、"CPPFLAGS" 等来自定义命令。常见的例子是 make "CFLAGS=-O -g"
以获得优化的调试程序,而无需重新定义所有规则。