Makefile找不到我的.cpp依赖文件

时间:2019-03-24 16:49:18

标签: c++ makefile

Files makefile.vars我正在尝试编译4个.cpp文件和一个标头,同时运行编译过程,这样我可以获取目标文件和汇编文件,但makefile给了我找不到我的原始.cpp文件的错误。 “没有规则使Add.s. Stop成为目标Add.cpp。”

#include "makefile.vars"
$(Bin)Main: $(Objects)Add.o $(Objects)Subtract.o $(Objects)Multiply.o $(Objects)common.o $(Objects)Main.o
    $(GCC) $(Objects)Add.o
    $(Objects)Subtract.o
    $(Objects)Multiply.o
    $(Objects)common.o
    $(Objects)Main.o
    -o $(Bin)Main
clean:
    rm -rf $(Bin)/* $(Objects)/* $(Pre)/* $(Assembly)/*

$(Assembly)Add.s: $(Source)Add.cpp
    $(GCC) $(DEBUG) $(GCC_FLAGS) $(INCLUDES) -S  -o $(Source)Add.cpp  $(Assembly)Add.s
$(Assembly)Add.o: $(Source)Add.s
    $(GCC) $(DEBUG) $(GCC_FLAGS) $(INCLUDES) -c -o $(Assembly)Add.s $(Objects)Add.o

$(Assembly)Subtract.s: $(Source)Subtract.cpp
    $(GCC) $(DEBUG) $(GCC_FLAGS) $(INCLUDES) -S -o $(Source)Subtract.cpp  $(Assembly)Subtract.s
$(Assembly)Subtract.o: $(Source)Subtract.s
    $(GCC) $(DEBUG) $(GCC_FLAGS) $(INCLUDES) -c -o $(Assembly)Subtract.s $(Objects)Subtract.o

$(Assembly)Multiply.s: $(Source)Multiply.cpp
    $(GCC) $(DEBUG) $(GCC_FLAGS) $(INCLUDES) -S -o $(Source)Multiply.cpp  $(Assembly)Multiply.s
$(Assembly)/Multiply.o: $(Source)/Multiply.s
    $(GCC) $(DEBUG) $(GCC_FLAGS) $(INCLUDES) -c -o $(Assembly)Multiply.s $(Objects)Multiply.o

$(Assembly)Main.s: $(Source)Main.cpp
    $(GCC) $(DEBUG) $(GCC_FLAGS) $(INCLUDES) -S -o $(Source)Main.cpp  $(Assembly)Main.s
$(Assembly)/Main.o: $(Source)/Main.s
    $(GCC) $(DEBUG) $(GCC_FLAGS) $(INCLUDES) -c -o $(Assembly)Main.s  $(Objects)Main.o

$(Assembly)common.s: $(Header)common.h
    $(GCC) $(DEBUG) $(GCC_FLAGS) $(INCLUDES) -S -o $(Header)common.h  $(Assembly)common.s
$(Assembly)common.o: $(Source)common.s
    $(GCC) $(DEBUG) $(GCC_FLAGS) $(INCLUDES) -c -o $(Assembly)common.s $(Objects)common.o

我希望我的文件最后成为可以链接的目标文件。

1 个答案:

答案 0 :(得分:3)

您的问题是您在makefile中使用C / C ++预处理器#include。 Makefile不是C / C ++代码。

在makefile中,#引入了注释行,因此该行的其余部分将被忽略。

此外,make不会对引号做任何特殊的处理,因此您不应该在makefile的非配方部分中使用它们(当然,您应该在传递给shell的配方中需要的地方使用它们,因为shell 确实用引号引起来)。

更改:

#include "makefile.vars"

收件人:

include makefile.vars

ETA

您的下一个问题是因为您滥用了变量,所以make无法创建依赖关系链。请考虑以下规则:

$(Bin)Main: $(Objects)Add.o ...
        ...
$(Assembly)Add.s: $(Source)Add.cpp
        ...
$(Assembly)Add.o: $(Source)Add.s
        ...

第一个规则告诉它可以从$(Bin)Main创建$(Objects)Add.o。第二个参数说make可以从$(Assembly)Add.s创建$(Source)Add.cpp。最后一条规则告诉它可以从$(Assembly)Add.o创建$(Source)Add.s

这些规则都不告诉我们如何创建$(Objects)Add.o(假设变量ObjectsAssembly的值不同)。

如果您解决了该问题,那么您将失败,因为您的规则都没有告诉make如何构建$(Source)Add.s的先决条件。

您需要在所有地方对相同目标使用相同的变量;最终规则应该是:

Add.o

ETA2

您的规则也是错误的:您正在使用$(Objects)Add.o: $(Assembly)Add.s ... ,因此您要求编译器生成将覆盖您的源文件的输出。我希望您在修复makefile足以删除所有代码之前先看到此编辑。

ETA3

如果您使用pattern rules而不是一遍又一遍地复制所有文本,那么您的makefile将会更简单,并且 lot 容易出错(并且更容易修复错误)。 ;删除所有用于构建程序集和目标文件的规则,并添加以下两个模式规则:

-o $(Source)Add.cpp