gpt4 book ai didi

c++ - header 中的更改不会导致使用 makefile 重新编译

转载 作者:行者123 更新时间:2023-11-30 05:22:37 25 4
gpt4 key购买 nike

编辑

写完这篇文章后,我注意到了一些事情,然后重新查看了文件。我更改了行:

$(CXX) -MT $(BUILD_DIR)/$(@:.d=.o) -MM $(CXXFLAGS) $^ > $@

以下内容:

$(CXX) -MM $(CXXFLAGS) $^ > $@

由于首先将生成的依赖文件命名为 .o 文件,然后将它们转回 .d 文件似乎有些多余。

现在target确实make了,但是改了头文件还是不会remake。

原创

我有这个作为类(class)一部分创建的 makefile,运行 make 时一切正常,为主机和目标构建。当头文件(例如:part1.h)发生变化时,问题就出现了,这个实现是专门为考虑到这一点而设计的,它似乎有效。

几个星期过去了,我终于意识到它没有按预期工作,因为它不会在更改任何头文件后重新编译。 (part1.h 或 part2.h)。

我查看了目标生成的依赖文件:

$(BUILD_DIR)/%.d: %.cpp

part1.d 的一个例子有以下内容:

build/host/build/host/part1.o: part1.cpp part1.h

对我来说,双重目录列表是一个错误,但我尝试更改行:

$(CXX) -MT $(BUILD_DIR)/$(@:.d=.o) -MM $(CXXFLAGS) $^ > $@

对于以下内容,删除 BUILD_DIR 变量:

$(CXX) -MT $(@:.d=.o) -MM $(CXXFLAGS) $^ > $@

这样做解决了双重目录列表问题,但给我一个链接器错误:

build/host/main.o: file not recognized: 文件格式无法识别

我正试图找到一些解决方案,这将确保在对头文件进行更改时重新编译程序。

我想弄清楚我遗漏了什么,我查看了相关文献,一切似乎都匹配。

SOURCES=main.cpp part1.cpp part2.cpp
OBJECTS=$(addprefix $(BUILD_DIR)/,$(SOURCES:.cpp=.o))
DEPS=$(addprefix $(BUILD_DIR)/,$(SOURCES:.cpp=.d))
EXE=prog
CXXFLAGS=-I.

#Make sure that default choice for make is the host
ifndef (${ARCH})
ARCH=host
endif

#Making for host
ifeq (${ARCH},host)
CXX=g++
BUILD_DIR=build/host
BIN_DIR=bin/host
endif

# Making for target
ifeq (${ARCH},target)
CXX=arm-devkit-g++
BUILD_DIR=build/target
BIN_DIR=bin/target
endif

$(BIN_DIR)/$(EXE): $(DEPS) $(OBJECTS)
$(CXX) $(CXXFLAGS) -o $@ $(OBJECTS)

#Generate dependency files. Place them in build/host or build/target depending on choice
$(BUILD_DIR)/%.d: %.cpp
$(CXX) -MT $(BUILD_DIR)/$(@:.d=.o) -MM $(CXXFLAGS) $^ > $@

#Generate object files. Place them in build/host or build/target, depending on choice.
$(BUILD_DIR)/%.o: %.cpp
$(CXX) -o $@ -c $^

#Create the build dir,
${BUILD_DIR}:
mkdir -p ${BUILD_DIR}

#Create the bin dir
${BIN_DIR}:
mkdir -p ${BIN_DIR}


.PHONY:clean
clean:
rm -f $(BUILD_DIR)/*.o $(BIN_DIR)/$(EXE) $(BUILD_DIR)/*.d

ifneq ($(MAKECMDGOALS),clean)
-include $(DEPS)
endif

最佳答案

如果您在编译过程中生成依赖项,您不仅可以避免采取额外的步骤,还可以依赖编译器生成正确的路径。这需要对您的 makefile 进行一些其他更改,但我发现重写它更简单,make 具有许多功能来简化其他一些操作。

arch ?= host

build_dir := build/$(arch)
bin_dir := bin/$(arch)

ifeq ($(arch),target)
prefix := arm-devkit-
endif

sources := main.cpp part1.cpp part2.cpp
objects := $(sources:%.cpp=$(build_dir)/%.o)
deps := $(objects:.o=.d)

target := $(bin_dir)/prog

CXX := $(prefix)$(CXX)
CPPFLAGS := -MMD -MP

$(target): CC := $(CXX)
$(target): $(objects) | $(bin_dir)
$(LINK.o) $^ $(LDLIBS) -o $@

$(build_dir)/%.o: %.cpp | $(build_dir)
$(COMPILE.cpp) $(OUTPUT_OPTION) $<

$(build_dir) $(bin_dir): ; mkdir -p $@

.PHONY: clean
clean: ; $(RM) $(target) $(objects) $(deps)

-include $(deps)

关于c++ - header 中的更改不会导致使用 makefile 重新编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39537287/

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