有几个不同的问题已经与我想做的事情相关,例如 this , this ,和 this 。但是,我已经查看了其中的内容以及它们链接到的内容,但仍然无法使其正常工作。
我有以下 make 文件(我对此有一些帮助 here )。它根据源目录中的 .cpps 在构建目录中构建 .os。我想调整这个,以便如果 header 被更新,那么它会正确地重新编译这些 header ,这样我就不必 make clean
整个事情(尤其是 INC_DIR1
文件夹中的那些)。
CC = g++
CFLAGS = -g -Wall
INC_DIR1 = include
INC_DIR2 = C:/CPPFiles/CPP_Extra_Libraries/armadillo-4.200.0/include
INC_DIR = $(INC_DIR1) $(INC_DIR2)
INCLUDES = $(foreach d, $(INC_DIR), -I$d)
BUILD_DIR = build
SRC_DIR = test
SRC = $(wildcard */*.cpp)
VPATH = $(SRC_DIR)
OBJS = $(addprefix $(BUILD_DIR)/, $(notdir $(SRC:.cpp=.o)))
MAIN = armadillo_extra_functions_test
.PHONY: depend clean
all: $(BUILD_DIR) $(MAIN)
@echo compilation complete
$(BUILD_DIR):
mkdir -p $@
$(BUILD_DIR)/%.o: %.cpp
$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
$(MAIN): $(OBJS)
$(CC) $(CFLAGS) $(INCLUDES) -o $(MAIN) $(OBJS)
clean:
$(RM) *.o *~ $(MAIN) $(BUILD_DIR)/*.o
depend: $(SRC)
makedepend $(INCLUDES) $^
我最近尝试的就是删除 depend
和makedepend
语句,然后替换 $(BUILD_DIR/%.o: %.cpp
声明与
DEPS = $(patsubst %.o, %.d, $(OBJS))
-include $(DEPS)
$(BUILD_DIR)/%.o: %.cpp
$(CC) -c $(CFLAGS) $(INCLUDES) $< -o $@
$(CC) -c $(CFLAGS) -MMD $< > $(DEPS)
如果没有这些调整的最后一行,make 文件将运行,但不会更新 header 。但是,当我添加最后一行时,我收到有关 $(BUILD_DIR)/%.d
的错误。文件不存在。
最佳答案
基本上,您需要构建 makefile,以便 .cpp 文件依赖于 header 。这样, header 的更改将触发 .cpp 文件的重新编译。为了使这更容易,理想情况下将自动确定每个 .cpp 文件的头依赖项。
我建议使用 GNU autotools方法(非常适合您将以源代码形式发布的软件),jam (非常简单的配置),或者(我目前最喜欢的)CMake 。所有这些本质上都是从另一个文件(或一组文件)自动生成 makefile。它们也会自动处理依赖性检测和管理。我只会手写一个 makefile 用于自学或只有少数源文件的东西,或者可能是一些奇怪和复杂的东西。
关于c++ - 制作并重新编译带有子目录的 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23700067/