Gnu Make不检查头文件

时间:2018-04-16 10:57:22

标签: makefile header dependencies gnu-make

我不太了解依赖关系

TARGET = prog1.exe

SRC = src
# dir. with *.cpp
INC = inc 
# dir. with *.hpp
BIN = bin 
# dir. with *.o, *.out,*.exe

SOURCE = $(wildcard $(SRC)/*.cpp)

OBJECT = $(patsubst %, $(BIN)/%, $(notdir $(SOURCE:.cpp=.o)))

CXX = g++
CXXFLAGS = -g -I$(INC)

ifneq ($(ARGS),'')
GDBI := --args $(BIN)/$(TARGET) $(ARGS)
else
GDBI := $(BIN)/$(TARGET)
endif

$(BIN)/$(TARGET): $(OBJECT)
    $(CXX) -o $@ $^

$(BIN)/%.o: $(SRC)/%.cpp
    $(CXX) $(CXXFLAGS) -c $< -o $@

.PHONY: help run clean depurate

run: $(BIN)/
    $(BIN)/$(TARGET) ${ARGS}

clean: 
    rm -f $(OBJECT) $(BIN)/$(TARGET)

depurate:
    gdb $(GDBI) 

help:
    @echo "Para ejecutar: \`make run' o \`make ARGS=\"<argumentos>\" run'."

为什么Make不检查目录inc /?

中的头文件.hpp的更改

对于没有源文件的标头,这个解决方案是正确的吗? 我的意思是:x.cpp包含x.hpp,x.hpp包括a.hpp和b.hpp。

$(BIN)/%.o: $(SRC)/%.cpp $(INC)/%.hpp
        $(CXX) $(CXXFLAGS) -c $< -o $@

1 个答案:

答案 0 :(得分:0)

Make不会对头文件进行依赖性检查,因为它们没有在任何地方明确列为依赖项。

如果您想让源文件依赖于头文件的所有,您可以这样做:

HEADERS:=$(wildcard $(INC)/*.hpp)
$(BIN)/%.o: $(SRC)/%.cpp $(HEADERS)

每当任何标题发生变化时,这将重建所有源文件,但这可能有点过分。如果您只希望源文件依赖于它实际使用的那些头文件,那么您将需要使用编译器的自动依赖关系生成功能:

CXXFLAGS = -g -I$(INC) -MMD -MF $(<:.cpp=.d)

include $(wildcard $(SRC)/*.d)

$(BIN)/%.o: $(SRC)/%.cpp
    $(CXX) $(CXXFLAGS) -c $< -o $@

clean: 
    rm -f $(OBJECT) $(BIN)/$(TARGET) $(SRC)/*.d

现在,当编译器编译.cpp文件时,它将创建一个匹配的.d文件。此文件是makefile的一小部分,列出.cpp文件使用的标头。下次构建时,include行会提取所有这些.d文件,并使用该信息来帮助计算依赖关系。蒂姆在评论中提到的blog post详细解释了这是如何运作的。