如何避免枚举目标文件?
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))
嗯,项目有:
-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))