gpt4 book ai didi

c++ - 使用子目录制作和重新编译标题

转载 作者:搜寻专家 更新时间:2023-10-31 01:44:18 24 4
gpt4 key购买 nike

有几个不同的问题已经与我正在尝试做的事情相关,例如 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 文件就会运行,但它不会更新标题。但是,当我在最后一行添加时,我收到有关 $(BUILD_DIR)/%.d 文件不存在的错误。

最佳答案

基本上,您需要构建 makefile,以便 .cpp 文件依赖于 header 。这样,对 header 的更改将触发 .cpp 文件的重新编译。为了使这更容易,理想情况下,每个 .cpp 文件的 header 依赖项将自动确定。

我建议使用 GNU autotools方法(非常适合您将以源代码形式发布的软件),jam (非常简单的配置),或(我目前最喜欢的)CMake .所有这些本质上都是从另一个文件(或一组文件)自动生成 makefile。他们也自动处理依赖检测和管理。我只会手写一个 makefile 用于自学或只有少数源文件的东西,或者可能是一些奇怪而复杂的东西。

关于c++ - 使用子目录制作和重新编译标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23700067/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com