c++ - 制作并重新编译带有子目录的 header

标签 c++ makefile

有几个不同的问题已经与我想做的事情相关,例如 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) $^

我最近尝试的就是删除 dependmakedepend语句,然后替换 $(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/

相关文章:

c++ - 使用正则表达式进行范围检查?

c++ - 在多文件项目中正确#include SDL

c++ - make : error adding symbols: DSO missing from command line 时出错

c++ - 使命令创建一个.file,但不创建应用程序文件

c - MAKE如何记住文件时间戳

c++ - 来自 .txt 文件的结构数组

c++ - C++中的可变用户定义参数列表?

c++ - GStreamer 失真取决于图像大小

c++ - QtCreator 和 OpenCV

c++ - 编译错误(g++ 和 make)