我不太了解依赖关系
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 $@
答案 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详细解释了这是如何运作的。