生成文件自动 SRC 文件检测和依赖项生成

makefile automatic src file detection and dependency generation

本文关键字:文件 依赖 SRC 检测      更新时间:2023-10-16

我的c ++项目有以下设置:

在 src 文件夹中,有 *.cpp 和相应的 *.h 文件和在 obj 文件夹中,我想拥有我的 .o 文件。

到目前为止,编译和链接不是问题。但是现在我有太多的.cpp和.h文件,无法手动将它们放入Makefile中。所以我决定在 makefile 中写这个小指令:

collect_sources:
@echo "collecting source files";
@echo "SRCS = \" > sources;
@for file in ./src/*.cpp; 
do 
    echo "$$file \" >> sources; 
done

我也做

-include sources

在生成文件的开头

生成的文件看起来sources不错,尽管最后一行有一个我不喜欢的反斜杠。但这也应该是有害的。

我现在还需要自动建立依赖项。在我的最新版本中,我将 *.cpp 文件定义为直接在 Makefile 中SRCS,以下代码很好:

$(SRCDIR)/%.cpp:
  @$(CXX) $(DEPFLAGS) -MT 
  "$(subst $(SRCDIR),$(OBJDIR),$(subst $(EXT_SRC),$(EXT_OBJ),$$file))" 
  $(addprefix ,$$file) >> $(DEP);
clear_dependencies:
    echo "" > $(DEP);
depend: clear_dependencies $(SRCS)

但是包含sources -file,它永远不会到达上层代码块。

以下是在生成文件顶部定义的常量:

CXX = g++
CXXFLAGS = -Wall 
       -Wextra 
       -Wuninitialized 
       -Wmissing-declarations 
       -pedantic 
       -O3 
       -p -g -pg
LDFLAGS =  -p -g -pg
DEPFLAGS = -MM
SRCDIR  = ./src
OBJDIR  = ./obj
TARGET = ./bin/my_funky_function_which_is_not_the_real_name
-include sources
OBJSTMP =   $(SRCS:.cpp=.o)
OBJS        =   $(OBJSTMP:$(SRCDIR)=$(OBJDIR))
DEP = depend.main
EXT_SRC =   .cpp
EXT_OBJ =   .o

我错过了什么?我的方法有效/可行吗?

好吧,你要求它。

1:你的collect_sources:... include sources是光荣的鲁布·戈德堡黑客。只需这样做:

SRCS = $(wildcard ./src/*.cpp)

如果你想通过肉眼确认它,你可以这样做:

$(info $(SRCS))

阿拉伯数字:

clear_dependencies:
    echo "" > $(DEP);

只是为了美观,让我们解决这个问题。

clear_dependencies:
    $(RM) $(DEP);

3:

$(SRCDIR)/%.cpp:
    @$(CXX) $(DEPFLAGS) -MT 
  "$(subst $(SRCDIR),$(OBJDIR),$(subst $(EXT_SRC),$(EXT_OBJ),$$file))" 
  $(addprefix ,$$file) >> $(DEP);

这将需要一些工作。首先是直接的问题:目标是存在的真实文件,并且规则没有先决条件。因此,该规则将不会运行(我不知道为什么它在以前的版本中对您有用,也许还有其他不同之处(。作为临时修复,我建议我们切换到静态模式规则和 PHONY 目标:

.PHONY:$(SRCS)
$(SRCS) : $(SRCDIR)/%.cpp:
    @$(CXX) $(DEPFLAGS) -MT 
   ...

看看这一切是否有效,那么我们就可以解决大问题。