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
我希望我的文件最后成为可以链接的目标文件。
答案 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
(假设变量Objects
和Assembly
的值不同)。
如果您解决了该问题,那么您将失败,因为您的规则都没有告诉make如何构建$(Source)Add.s
的先决条件。
您需要在所有地方对相同目标使用相同的变量;最终规则应该是:
Add.o
ETA2
您的规则也是错误的:您正在使用$(Objects)Add.o: $(Assembly)Add.s
...
,因此您要求编译器生成将覆盖您的源文件的输出。我希望您在修复makefile足以删除所有代码之前先看到此编辑。
ETA3
如果您使用pattern rules而不是一遍又一遍地复制所有文本,那么您的makefile将会更简单,并且 lot 容易出错(并且更容易修复错误)。 ;删除所有用于构建程序集和目标文件的规则,并添加以下两个模式规则:
-o $(Source)Add.cpp