首页 > 解决方案 > 使用从 gcc -MM 生成的规则时,Make 会创建空依赖项

问题描述

我正在尝试创建一个生成文件,该文件在 src 目录中的所有 cpp 文件发生更改时或它们包含的标头更改时编译它们。我的问题是,当文件包含足够的文件时,gcc 将规则包装到新行,根据使用 -M 选项的文档,make 将换行符视为另一个空格,并且规则尝试创建一个空依赖项。

例如,使用 src 目录中的一个文件运行 makefile,该文件source.cpp包含:

#include "header1.hpp"
#include "header2.hpp"
#include "header3.hpp"
#include "header4.hpp"
#include "header5.hpp"

将输出以下内容:

Missing file header1.hpp
Missing file header2.hpp
Missing file header3.hpp
Missing file
Missing file header4.hpp
Missing file header5.hpp
Compiling src/source.cpp...

这是我现在的makefile:

SRCDIR = src
OBJDIR = obj

SRCFLS = $(shell find $(SRCDIR) -name *.cpp)
OBJFLS = $(call getobj,$(SRCFLS))

CXXFLAGS = -c -I .

define \n


endef

define \t

endef

define getobj
$(subst $(SRCDIR)/,$(OBJDIR)/,$(subst .cpp,.o,$(1)))
endef

define getrule
$(shell $(CXX) -MM -MG -MT $(call getobj,$(1)) $(1))
endef

default : $(OBJFLS);

% :
    @echo Missing file $@

$(eval $(foreach FLE,$(SRCFLS),\
\
$(call getrule,$(FLE))$(\n)$(\t)\
    @echo Compiling $$<...$(\n)$(\t)\
    @mkdir $$(@D) -p$(\n)$(\t)\
    @-$(CXX) $(CXXFLAGS) $$< -o $$@$(\n)\
\
))

抱歉,如果问题令人困惑,我愿意澄清所需的任何细节。

标签: makefilegnu-make

解决方案


推荐阅读