【问题标题】:GNU make auto dependencies depends on directoryGNU make 自动依赖依赖于目录
【发布时间】:2016-11-24 21:59:22
【问题描述】:

(抱歉英语不好,我是德国人)

各位程序员,

我正在为我的 C++ 项目使用 GNU make,但我在自动依赖方面遇到了一些问题: 如果我执行“make objects/file.o”,它会告诉我 objects/file.o 已经是最新的,即使 source/file.cpp 包含的文件已更改。 奇怪的是,如果我将 DEP_DIR 和 OBJ_DIR 更改为“。”一切正常。 这是我的makefile(不完整):

SRC_DIR := source
DEP_DIR := dependencies
OBJ_DIR := objects

$(shell mkdir -p $(dir EXE_PATH))

-include $(addprefix $(DEP_DIR)/, $(NAMES:=.d))

$(OBJ_DIR)/%.o : $(SRC_DIR)/%.cpp
        $(CXX) -c $(CFLAGS) $(SRC_DIR)/$*.cpp -o $@
        $(CXX) -MM $(CFLAGS) $^ > $(DEP_DIR)/$*.d

$(EXE_PATH) : $(addprefix $(OBJ_DIR)/, $(NAMES:=.o))
        $(CXX) $(LINK_FLAGS) $^ -o $(EXE_PATH)

all : $(EXE_PATH)

run : 
        $(EXE_PATH)

carun : $(EXE_PATH)
        $(EXE_PATH)

clean:
        rm -f EXE_PATH

如果有人能向我解释这个奇怪的问题,我将不胜感激。

【问题讨论】:

标签: makefile dependencies gnu-make


【解决方案1】:

要回答有关您所看到的错误的问题:目标或先决条件列表中出现的宏和函数会在解析生成文件时立即展开,早在 make 开始运行匹配模式并替换 @987654322 的规则之前@。所以,在这一行:

$(depDir)/%.d : $(srcPath)/%.cpp $(shell cat $(depDir)/%.d)

shell 函数在 make 读取 makefile 时被调用,此时它将只使用逐字字符串 %.d,因为还没有发生模式匹配。

正如其他答案中提到的,这无论如何都不是进行自动依赖生成的正确方法(您实际上并没有展示这些 .d 文件是如何生成的,因此很难给出具体建议)。

如果您想了解如何以更现代、更高效的方式执行此操作,您可以查看this blog post

【讨论】:

    【解决方案2】:

    这不是现在的依赖生成方式,你可以生成依赖作为编译的side effect。同时使用内置变量名CXXCPPFLAGSCXXFLAGSLDFLAGSLDLIBS,并回收make的内置recipes。

    .PHONY: all
    all: Release/$(EXE_NAME)
        echo "finished building... in theory"
    
    Release/$(EXE_NAME): CC := $(CXX)
    Release/$(EXE_NAME): $(OBJS) | Release
        $(LINK.o) $^ $(LDLIBS) -o $@
    
    $(objDir)/%.o: CPPFLAGS += -MMD -MP 
    $(objDir)/%.o: $(srcPath)/%.cpp | $(objDir)
        $(COMPILE.cpp) $(OUTPUT_OPTION) $<
    
    $(objDir) Release: ; mkdir -p $@
    
    -include $(OBJS:.o=.d)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 2015-05-09
      • 2020-08-22
      • 1970-01-01
      • 2016-07-05
      相关资源
      最近更新 更多