gpt4 book ai didi

c++ - GNU Makefile 自动依赖解析

转载 作者:行者123 更新时间:2023-11-28 07:57:54 28 4
gpt4 key购买 nike

我过去一直在使用 qmakeCMake 来生成我的 makefile。然而,最近我发现在我运行我的代码的一些集群上,这些工具更难找到/安装,所以我决定编写裸 Makefile。此外,我还可以学习有关 Makefile 的一两件事;)

我的项目涉及多个目录,其中包含源文件/头文件,并且它们之间通常存在交叉依赖关系。通过 SO,我学会了使用 -MM 标志自动生成依赖信息。我的 Makefile 看起来像这样

include $(HEAD_DIR)/common.mk

OBJS_DIR = objs
LIBS_DIR = libs

SRCS = Matrix.cpp MatrixFull.cpp
OBJS = $(patsubst %,$(OBJS_DIR)/%,$(SRCS:.cpp=.o))
LIB_0 = $(patsubst %, $(LIBS_DIR)/%,libalgebra.a)

DEPS := $(patsubst %,$(OBJS_DIR)/%,$(SRCS:.cpp=.d))
-include $(DEPS)

.PHONY: all
all:
@echo " ===== Building dependencies in lib/algebra ===== "
@$(MKDIR) $(OBJS_DIR)
@$(MAKE) $(OBJS)
@$(MKDIR) $(LIBS_DIR)
@$(MAKE) $(LIB_0)
@echo " ===================== done ===================== "

$(OBJS_DIR)/%.o: %.cpp
@echo " compiling source file: $< ..."
$(CXX) -c $(CXXFLAGS) -I$(INCLUDE_PATH) -MM $< -o $@

$(LIB_0): $($(OBJS_DIR)/%.o)
@echo " generating library file: $(@F) ..."
@$(AR) $(AR_FLAGS) $@ $^

.PHONY: clean
clean:
@$(RM) $(OBJS_DIR) $(LIBS_DIR)

这通常工作正常,但我想改进几件事:1) 当我更改头文件并发出 make 时,不知何故编译器不会选择 all 并且似乎默认为 DEPS。这应该发生在这个 makefile 中吗?如何使 all 成为默认规则?2) 如何让依赖文件不可见?我尝试了 DEPS := $(patsubst %,$(OBJS_DIR)/.%,$(SRCS:.cpp=.d)) 但这没有帮助3) 如果您认为这个 Makefile 可以通过任何其他方式改进,您有什么具体的建议可以给我吗?

编辑:老实说,我什至不确定 make 是如何调用编译器来生成依赖关系的:p ... 我没有看到任何明确的规则。它是否以某种方式隐藏在 DEPS := $(patsubst %,$(OBJS_DIR)/%,$(SRCS:.cpp=.d)) 中?

最佳答案

1) 将 -include $(DEPS) 移到 all 规则下方。第一条规则是默认规则(除非您有意设置一些特殊变量),因此如果 include 引入了 all: 之上的规则,那将是默认规则。

2) 我认为“使它们不可见”意味着您需要 .foo.d 而不是 foo.d。您必须修改生成它们的规则:

$(OBJS_DIR)/%.o: %.cpp
@echo " compiling source file: $< ..."
$(CXX) -c $(CXXFLAGS) -I$(INCLUDE_PATH) -MM $< -o $@
@mv $(OBJS_DIR)/$*.d $(OBJS_DIR)/.$*.d

然后是找到它们的变量:

DEPS := $(patsubst %.cpp,$(OBJS_DIR)/.%.d,$(SRCS))

3) 我会摆脱递归调用 ($(MAKE) ...),但您应该先确保其他一切正常。我很惊讶 $(OBJS_DIR)/%.o 规则没有进入 common.mk。除此之外,它看起来还不错。

4(?)) $(OBJS_DIR)/%.o 规则中的编译器命令使用了-MM 标志,因此编译器生成的依赖文件为副作用。

关于c++ - GNU Makefile 自动依赖解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12288093/

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