Windows 个 makefile 中的反斜杠

Backslashes in Windows makefiles

重要编辑:我已经用我的特定 makefile 解决了这个问题,但我不知道如何解决。

我用正斜杠替换了反斜杠,事实证明我的规则适用于那些。 Gcc 接受混合的正斜杠和反斜杠,所以它工作得很好。 mkdir 存在一个关键点:它不接受正反斜杠混合的路径。我更改了我的变量以在 Windows 版本中仅包含反斜杠,现在该文件可以完美运行。

作为参考,这里有一些新的规则和变量:

OUT = $(ROOT)\out SRC = $(ROOT)\src $(OUT): mkdir $(OUT) $(OUT)/%.o: $(SRC)/%.c $(CC) $(CFLAGS) -o $@ -c $<

为什么 minGW-make 在变量扩展后接受规则中的混合斜杠而不是反斜杠?这里到底发生了什么?


原版post

我为 windows 安装了 make 的 minGW。我复制了我的 unix makefile 并将命令转换为 windows(并将正斜杠转换为反斜杠)但是生成的 makefile 不起作用。

主要区别是 Windows 有 $(OUT) = $(ROOT)\out\win 而 Unix 有 $(OUT) = $(ROOT)/out。 Unix 工作正常。 make -f makefile.win 在 windows 上抱怨 <root>\out\win\LinkedList.o 没有规则。有问题的规则和错误是:

make: *** No rule to make target `H:\CodeRIT14Syllables\out\win\LinkedList.o', needed by `H:\CodeRIT14Syllables\out\win\bin\syllables.exe'. Stop.

$(OUT)\%.o: $(ROOT)\src\%.c gcc $(CFLAGS) -o $@ -c $<

$(OUT)\bin\syllables.exe: $(OUT)\LinkedList.o $(OUT)\Syllable.o $(OUT)\Model.o gcc $(CFLAGS) -o $@ $^

$(OUT) 应该扩展到 <root>\out\win 给它抱怨的文件一个明确的目标。我不明白为什么这条规则不起作用,因为同样的规则在 Unix 上工作得很好。是否有一些关于目标中最大目录的神秘规则?我没有足够的 make 经验来真正评估这里出了什么问题。

这是相关文件的全文:https://github.com/blastedt/syllables/blob/master/makefile.win

$(OUT)\%.o: 没有定义模式规则,你 escaped %.

$(OUT)\%.o: 在这种情况下应该可以工作,虽然这是因为像这样的陷阱,最好在 Windows 上使用 make 时避免反斜杠。

你会 运行 遇到 shell 命令的问题,比如 mkdirdel 不能使用正斜杠,你应该考虑切换到 powershell 、cygwin、MSYS2 或 bash on windows