在Windows的makefile中,反斜杠是什么意思?

5
重要更正:我已经解决了我的特定makefile的问题,但我不知道如何解决。
我用正斜杠替换了反斜杠,结果发现我的规则在正斜杠下工作良好。Gcc接受混合的前向和后向斜杠,所以它工作得很好。其中一个难点存在于mkdir:它不接受混合的正向和反向斜杠路径。在Windows版本中,我将变量更改为仅包含反斜杠,现在该文件完美运行。
以下是一些新规则和变量: OUT = $(ROOT)\out SRC = $(ROOT)\src $(OUT): mkdir $(OUT) $(OUT)/%.o: $(SRC)/%.c $(CC) $(CFLAGS) -o $@ -c $<
为什么mingw-make在变量扩展后接受混合斜杠却不允许只有反斜杠?这到底是怎么回事?
原始帖子:
我在Windows上安装了minGW,并复制了我的Unix makefile并将其转换为Windows(从正斜杠到反斜杠),但生成的makefile无法正常工作。
主要区别在于Windows具有$(OUT) = $(ROOT)\out\win,而Unix具有$(OUT) = $(ROOT)/out。Unix工作正常。在Windows上运行“make-f makefile.win”会抱怨没有规则,需要“<root>\out\win\LinkedList.o”。有问题的规则和错误如下: make:***没有为目标“H:\CodeRIT\1014Syllables\out\win\LinkedList.o”制定规则,需要“H:\CodeRIT\1014Syllables\out\win\bin\syllables.exe”。 停止。 $(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
1个回答

2

$(OUT)\%.o:没有定义模式规则,你已经在%前使用了转义字符

$(OUT)\\%.o:在这种情况下应该起作用,尽管像这样的陷阱最好避免在Windows上使用反斜杠。

你将遇到诸如mkdirdel等shell命令无法使用正斜杠的问题,你应该考虑切换到powershell、cygwin、MSYS2或Windows上的bash


谢谢!我看到了很多文档建议像 PATH_SEP = \\ 这样的东西,或者在执行之前使用一个替换 / 为 \ 的函数。这些是可靠的解决方案来解决这些问题吗?我在 Windows 上使用 Ubuntu 的 bash,但根据我的经验,它不能执行我创建的文件,所以我还需要 Windows 的构建链。 - Blastedt
@Blastedt 我自己尝试了一些不同的方法,比如替换斜杠或者编写命令脚本来替代类似rm的bash功能,但最后发现这太麻烦了,所以我转而使用powershell加上正斜杠。反正自从Windows 7起,默认已经安装了powershell。 - user657267
1
我们在Windows上使用GNU make(版本3.81)时遇到了问题,其中make无法识别一个目标的依赖项与目标本身不完全相同的情况。因此,make会抱怨“没有规则可以制作目标blah blah blah”或类似的内容。我们费尽心思确保所有路径仅使用反斜杠指定。:-\ - antred

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接