如何避免枚举目标文件?

How to avoid enumeration of object files?

嗯,项目有:

-include 目录 /* 头文件 */

-src 目录。 /* 对于源代码 */

-构建目录。 /* 对于目标文件和可执行文件 */

生成文件:

  1 BUILD_DIR   = $(CURRENT_DIR)/build
  2 INCLUDE_DIR = $(CURRENT_DIR)/include
  3 SRC_DIR     = $(CURRENT_DIR)/src
  4
  5 CC = gcc
  6 CFLAGS = -Wall -g -I
  7
  8 $(BUILD_DIR)/%.o: $(SRC_DIR)/%.c $(INCLUDE_DIR)/%.h
  9     @$(CC) $(CFLAGS) $(INCLUDE_DIR) -c $< -o $@
 10
 11 SRC_FILES   =   $(wildcard $(SRC_DIR)/*.c)
 12 HEADER_FILES=   $(wildcard $(INCLUDE_DIR)/*.h)
 13
 14
 15 OBJECT_FILES=   $(BUILD_DIR)/module_1.o        \
 16                 $(BUILD_DIR)/module_2.o        \
 17                 $(BUILD_DIR)/module_3.o
 18 
 19
 20 prog: $(SRC_DIR)/main.c $(OBJECT_FILES)
 21     @$(CC) $(CFLAGS) $(INCLUDE_DIR) $^ -o $(BUILD_DIR)/$@

如何避免枚举目标文件,类似:

OBJECT_FILES = $(wildcard $(BUILD_DIR)/*.o)

但是这一行产生“未定义引用”错误。

您不能使用 $(wildcard $(BUILD_DIR)/*.o),因为当读入 makefile 时这些文件不存在:它们是由 makefile 构建的。所以当你开始构建时,这将是空的。

通常人们所做的是将源文件列表转换为目标文件,因为这是编译器所做的。所以:

OBJECT_FILES := $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.o,$(SRC_FILES))