出于某种原因,我永远不会掌握现代编程方法。作为一个68k的汇编程序员,我试图使用单个树文件来关闭最终文件的所有内容,而是遵循更典型的"构建/链接对象"方案。但是,我花了4天的时间试图找到合理的解释并解决这个问题。
我试图自动检测并构建某个文件夹中的每个文件,该文件夹的对象被打包到一个特定的对象中,该对象将其他特定的对象链接在一起。
这是makefile:https://pastebin.com/H6QE29fj
CUR = $(SRC)\lib
VPATH = $(OBJ) $(CUR)
INPUT = $(notdir $(wildcard $(CUR:\=/)/*))
$(OBJ)\library.md.o: $(INPUT:.asm=.o)
$(VLINK) -r -o $@ $(addprefix $(OBJ)\,$(notdir $^))
问题在于上面。几天前,我使用相同的代码片段从$(SRC)\ ints文件夹生成$(OBJ)\ ints.md.o。完全没有问题,我甚至在使用$(INPUT)变量之前手动添加了一个文件名,因此它会在SECTION(引擎shenanigans)的开头汇编。
如果所说的代码"工作",为什么它不适用于图书馆?
make: *** No rule to make target `loadtilemap.o', needed by `.\src\__obj\library.md.o'. Stop.
%.o:%。asm rule?
是不是已经足够了答案 0 :(得分:3)
首先,我建议您在使用makefile中的路径时始终使用正斜杠而不是反斜杠。几乎所有Windows命令都将接受路径中的任一样式。如果需要调用不接受正斜杠作为路径分隔符的命令,请在需要它的配方内进行转换。 make
是一个UNIX / POSIX工具,因此它通常使用目录分隔符和反斜杠的正斜杠作为转义序列。在针对Windows编译时,DTRT会针对反斜杠做出一些努力,但它可能无法在任何地方使用。只需使用正斜杠,然后继续使用其他东西。
以下是makefile的提示:
%.o: %.asm
$(V68k) $(BUILDARGS) -L $(LST)\$(notdir $(basename $@)).txt -o $(OBJ)\$@ $<
目标(几乎)永远无法正确创建$@
以外的文件。这是我Second Rule of Makefiles。每当您看到构造不仅仅是$@
的文件的规则时,您就知道存在问题。想要建立一个目标。它知道它想要构建什么目标,并将该目标的路径放在$@
变量中。如果你在你的食谱中觉得需要创建一个而不是的文件$@
,那么你就知道你并且对于一些基本的东西不同意,并且不同意make不会给你你想要的结果:)。
如果要在与源不同的目录中创建文件,则该目录必须包含在规则中:
$(OBJ)/%.o: %.asm
$(V68k) $(BUILDARGS) -L $(LST)\$(notdir $(basename $@)).txt -o $@ $<
这也意味着您的链接配方:
$(OBJ)\library.md.o: $(INPUT:.asm=.o)
$(VLINK) -r -o $@ $(addprefix $(OBJ)\,$(notdir $^))
不起作用。为什么?因为先决条件不包括目录。您需要将其更改为:
$(OBJ)\library.md.o: $(INPUT:%.asm=$(OBJ)/%.o)
$(VLINK) -r -o $@ $^
您可能认为将$(OBJ)
添加到VPATH
将有助于解决此问题,但事实并非如此。这不是VPATH
设计工作的方式; VPATH
只能用于搜索源文件,从不生成像目标文件这样的文件。原因很复杂,但如果您想要详细信息,则有detailed explanation here。