使用-MM在Makefile中生成依赖项时出现问题

Jab*_*bez 6 makefile

我是Makefiles和g ++的新手,我在使用-MM标志生成项目文件的依赖项时遇到了问题.我正在发布我正在使用的Makefile供你考虑.请看一下.

OUTPUT_ROOT := output/
SOURCE_ROOT := source/

TITLE_NAME := TestProj 

SOURCES := \
 MyFile.cpp \
 stdAfx.cpp \
 Main.cpp \

OUT_DIR  := $(OUTPUT_ROOT)

OUT_O_DIR := $(OUT_DIR)

OBJS = $(SOURCES:%.cpp=$(OUT_O_DIR)%.o)
DEPS = $(OBJS:%.o=%.d)
DIRS = $(subst /,/,$(sort $(dir $(OBJS))))
SOURCE_TARGET = $(SOURCES:%.cpp=$(SOURCE_ROOT)%.cpp)
OUTPUT_TARGET = $(OUT_DIR)$(TITLE_NAME)

#---------------------------------------------------------------------
# executables
#---------------------------------------------------------------------
MD := mkdir -p
RM := rm
CC := g++

#---------------------------------------------------------------------
# rules
#---------------------------------------------------------------------
.PHONY: clean directories objects title

all: directories objects title

directories:
 @$(MD) $(DIRS)

clean:
 $(RM) -rf $(OUT_DIR)

$(OBJS): $(SOURCE_TARGET)
 @$(CC) -c $< -o $@

$(DEPS): $(SOURCE_TARGET)
 @$(CC) -c -MM $< > $(DEPS)

-include $(DEPS)

objects:$(OBJS) $(DEPS)

title: $(OBJS)
 @$(CC) $< -o $@
Run Code Online (Sandbox Code Playgroud)

我尝试了几个选项,并且很多次.我用谷歌搜索解决方案,但找不到任何解决方案.

使用"-MM"标志生成依赖项的正确选项?? 如果没有,请建议我生成依赖项的正确方法.我想自动生成依赖项,因为我的项目将包含很多文件.我认为这是比手动记下evey依赖项更好的选择.

这些是我得到的错误

g++: stdAfx.d: No such file or directory
g++: Main.d: No such file or directory
make: *** No rule to make target `stdAfx.d', needed by `objects'.  Stop.
Run Code Online (Sandbox Code Playgroud)

提前致谢.

mcd*_*ave 8

看起来您正在尝试为每个.cpp文件生成一个依赖文件(通过makefile规则调用*.d).这不是我对如何使用依赖项文件的理解.

使用-M选项为项目生成单个依赖项文件,然后包含依赖项文件.

DEPS = $(OUR_DIR)/make.dep

$(DEPS): $(SOURCE_TARGET)
    @$(CC) -M $(SOURCE_TARGET) > $(DEPS)

include $(DEPS)
Run Code Online (Sandbox Code Playgroud)

编辑您的依赖项文件也应该取决于您的标题

$(DEPS): $(SOURCE_TARGET) $(HEADER_TARGET)
    @$(CC) -M $(SOURCE_TARGET) > $(DEPS)
Run Code Online (Sandbox Code Playgroud)

其中HEADER_TARGET的定义与SOURCE_TARGET相同.这样,当更改头文件时,将重建依赖项文件.

  • 只是想指出,“-MM”排除了系统标头(或多或少),这可能会使构建速度更快,因为分配的文件较少,用于 1) 检查 2) 构建依赖列表的过程。例如,使用一些 stl 包含创建 foo.cpp 并运行 `g++ -M foo.cpp` 可以看到它输出了近 100 个依赖项的列表,这些依赖项都没有改变,所有这些依赖项都必须在每个构建中进行检查。 (2认同)