0

我看过,发现了一些看起来与这个问题相关的答案,但似乎没有任何帮助。

这是通常的故事 - 我有一个包含 .hpp 和 .cpp 文件的文件夹,我想将它们编译为 .o 文件,然后只有在它们所依赖的文件发生更改时才重新编译文件。

我当前的makefile是:

SRCS = $(shell find ../Includes/ -name "*.cpp")
DEPS = $(SRCS:.cpp=.d)
OBJS = $(SRCS:.cpp=.o)

all: $(DEPS) $(OBJS)

# Create the dependency files
%.d : %.cpp
    clang++ -MM $< -o $@ -c -std=c++11

# Include the dependency files
include $(DEPS)

# Compile the source files
%.o : %.cpp
    clang++ -c -Wall -std=c++11 $< -o $@

我已经运行了几次(所以依赖文件在我运行 make 之前就存在,并且在我包含它们时肯定存在)。我还尝试将 %.d 添加到 %.o 的依赖项中。

基本上,此时发生的所有事情都是“触摸” .cpp 会导致重新生成 .o 和 .d 文件,而触摸 .hpp 文件(在 .d 文件中列出的其他文件)什么也不做。

示例依赖文件:

SomeFile.o : ../Includes/SomeFile.cpp \
    ../Includes/SomeFile.hpp ../Includes/SomeOtherFile.hpp
4

2 回答 2

1

除了路径问题,我发现沿途创建依赖关系更自然,即使用-MDor-MMD标志。这样您就不需要规则来更新依赖文件。

CPPFLAGS += -MMD

TARGET := hello

.DEFAULT: all
all: $(TARGET)

SRCS := $(shell find . -type f -name "*.cpp")
OBJS := $(SRCS:.cpp=.o)
DEPS := $(SRCS:.cpp=.d)

hello: $(OBJS)
        $(LINK.cc) -o $@ $^

-include $(DEPS)
于 2013-03-08T13:37:39.907 回答
0

事实证明,我正在为以下内容创建规则:

SomeFile.o : ...

而我需要一个规则:

../Includes/SomeFile.o : ...

感谢 NovaDenizen 让我走上了正确的道路。

于 2013-03-08T13:21:12.367 回答