Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用-MM在Makefile中生成依赖项时出现问题_Makefile - Fatal编程技术网

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

使用-MM在Makefile中生成依赖项时出现问题,makefile,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

我是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 $@

提前感谢。

看起来您正试图为每个.cpp文件生成一个依赖项文件(根据makefile规则称为*.d)。这不是我对如何使用依赖项文件的理解

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

DEPS = $(OUR_DIR)/make.dep

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

include $(DEPS)
编辑依赖项文件也应取决于标题

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

其中,标头_目标的定义与源_目标的定义相同。这样,当头文件被更改时,依赖文件将被重建。

对于初学者来说,您正在做一些奇特的事情。您应该从简单开始,只在Makefile中使用100%理解和信任的代码。即使在一个包含数百个文件的大型项目中,您也不会花太多时间维护Makefile

赋值为:=的变量立即展开——赋值期间,所有$(VAR)值都被替换为变量的值。赋值为=的变量在使用时会展开,因此它们可以引用尚未定义的变量

g++的-MM标志将生成一个Makefile依赖项行,例如foo.o:foo.cc foo.hh,但我从未发现它有用。我有一个虚假的“依赖项”目标,它生成了一个依赖项文件。您使用这些单行依赖项生成一堆*.d文件的想法可能会奏效,但最终会生成很多这样的文件

您得到的错误来自g++,而不是make。这是因为当它是整个*.d文件列表时,您使用$(DEPS)就像使用单个文件一样。发生的情况如下:

@$(CC) -c -MM $< > $(DEPS)
mcdave刚刚发布了我用来生成依赖项文件的代码。您可以切换到单一依赖项文件样式,也可以将-MM命令更改为:

@$(CC) -MM $< > $@
@$(CC)-MM$<>$@

您可能还必须修复-include语句,因为我认为它不支持要包含的文件列表。

应该做什么?为什么有时使用“:=”有时使用“=”?它使用对象目录中对象的名称创建DEP。我只是在测试“=”和“:=“选项,但不知道确切的差异。谢谢你,肯,我现在使用的是单个文件,而不是太多的多个文件。谢谢你告诉我‘和’:’的区别,这对我很有帮助。谢谢你,麦克达夫,这是一个很好的技巧。我认为生成单个文件比生成大量文件要好。。。再次感谢。只想指出,
-MM
排除了系统头(或多或少),这可能会加快构建速度,因为构建依赖项列表的过程中分配了更少的文件1)检查2)过程。例如,使用一些stl包含创建foo.cpp,然后运行
g++-M foo.cpp
,看到它列出了近100个依赖项的列表,这些依赖项都不会改变,make必须在每个构建中检查所有这些依赖项。@Robert:谢谢提示--我不知道这一点,将更新我的make文件以提高效率!谢谢你在这里发帖。当使用这种技术时,我的$(DEPS)目标甚至在运行“makeclean”时被执行,这显然是不必要的,而且需要很长时间。您知道如何避免这种情况吗?我不确定这一点-我认为只要有
include$(DEPS)
行,就可以运行$(DEPS)目标。在运行
makeclean
时,可以添加if语句来删除include语句。
g++ -c -MM MyFile.cpp > MyFile.d stdAfx.d Main.cpp
@$(CC) -MM $< > $@