【发布时间】:2018-07-03 11:01:09
【问题描述】:
我正在尝试为项目编写 Makefile。这样,只要任何 C 文件发生更改,我就能够构建项目。但是,当头文件发生变化时,它不会生成。
所以,我正在尝试 Makefile 以获得更简单的目录结构,如果可行,我计划在主项目中做同样的事情。
目录结构是,
src -> code1 -> file1.c
src -> code2 -> file2.c
src -> code1inc -> file1.h
src -> code2inc -> file2.h
所有文件应该一起构建并提供一个二进制文件FinalBin
当 file1.h 发生变化时,它只需要构建 file1.c。 如何通过 Makefile 强制执行此操作?
这是我当前的 Makefile。
CC = gcc
CFLAGS = $(INCLUDES)
TARGET = FinalBin
SOURCES := $(wildcard *.c)
PATH_CODE1 = src/code1
PATH_CODE2 = src/code2
CODE1_SOURCES := $(wildcard $(PATH_CODE1)/*.c)
CODE1_OBJECTS := $(patsubst %.c,%.o,$(CODE1_SOURCES))
CODE2_SOURCES := $(wildcard $(PATH_CODE2)/*.c)
CODE2_OBJECTS := $(patsubst %.c,%.o,$(CODE2_SOURCES))
PATH_CODE1INC = src/code1inc
PATH_CODE2INC = src/code2inc
INCLUDES = -I$(PATH_CODE1INC) \
-I$(PATH_CODE2INC)
CODE1_HEADERS := $(wildcard $(PATH_CODE1INC)/*.h)
CODE2_HEADERS := $(wildcard $(PATH_CODE2INC)/*.h)
all: $(TARGET)
obj1 = $(CODE1_OBJECTS) $(CODE1_HEADERS)
obj2 = $(CODE2_OBJECTS) $(CODE2_HEADERS)
$(TARGET) : $(obj1) $(obj2)
$(CC) $^ -o $@
clean:
rm $(TARGET) $(CODE1_OBJECTS) $(CODE2_OBJECTS)
请指导我。
【问题讨论】:
-
让
$(CODE1_OBJECTS)依赖$(CODE1_HEADERS)?如果可以是多个目标文件和头文件,则必须明确列出依赖关系。 -
最好使用
-MD -MF到gcc的键来生成头文件依赖文件,然后将它们包含到您的makefile 中。我已经在我的非递归制作模板中做到了这一点,你可以看看并可能使用我的模板:github.com/igagis/prorab/blob/master/wiki/…