【问题标题】:What are the automatic rules make is using to build objects files without being specified?什么是自动规则用于构建对象文件而没有指定?
【发布时间】:2019-12-08 19:58:39
【问题描述】:

我有一个旧项目,在一个目录中包含几个 C++ 源文件和头文件,这些文件是使用 GCC 和 makefile 在 cygwin 中构建的。在编辑生成文件以将所有临时文件和输出文件移动到子目录时,构建目标文件的规则没有任何效果。

$(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)

这种自动行为叫什么?

【问题讨论】:

标签: makefile gnu-make


【解决方案1】:

关于内置规则的两个注意事项:

在大型项目中(它们有自己的编译、链接等规则),从没有内置规则(make -rmake --no-builtin-rules)开始可能会更容易。

许多内置规则都有挂钩,通过变量,允许更改配置。例如:

%.o: %.c:
    $(COMPILE.c) $(OUTPUT_OPTION) $<

...
COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c

在哪里可以通过修改“CFLAGS”、“CPPFLAGS”等来自定义命令。常见的例子是make "CFLAGS=-O -g"以获得优化的调试程序,而无需重新定义所有规则。

【讨论】:

    【解决方案2】:

    无需您定义即可知道的规则集称为built-in rules。手册列出了大部分但不是全部。您可以运行make -p -f/dev/null 来查看它们的全部列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 2019-01-17
      • 2014-01-06
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 2016-06-23
      相关资源
      最近更新 更多