在 make 规则中使用时,如何让 MAKEFILE 保留字符串中的反斜杠序列?

How to let MAKEFILE retain the backslash sequences within a string when used in a make rule?

这是我在 Whosebug 上的第一个问题,所以如果我问了任何荒谬的问题,请原谅我:D。

问题:
假设我想编译目录 "my dir/" 中的程序,其中包含 space。假设程序的路径名是 "my dir/test.c".

这是我正在尝试的示例 makefile:

CC = gcc
DIR = my\ dir
$(DIR)/test.out: $(DIR)/test.c
#   $(CC) $< -o $@
    $(CC) $(DIR)/test.c -o $(DIR)/test.out



如您所见,在最后一行(第 5 行)中,我分别直接按照先决条件和目标中的方式编写了源文件和输出文件的路径名。这样做效果很好,因为它会产生命令:
gcc my\ dir/test.c -o my\ dir/test.out
这是将文件名(使用 spaces)传递给 gcc 或任何其他 shell 命令的语法正确方式。

倒数第二行(第 4 行)是问题所在(注释行)。我使用自动变量 $@(目标)和 $<(第一个也是唯一的先决条件)来生成 gcc 的文件名参数,我希望它是
my\ dir/test.outmy\ dir/test.c。但是在这里,出于某种原因,生成的文件名是 my dir/test.outmy dir/test.c 因此产生的命令是:
gcc my dir/test.c -o my dir/test.out
现在,gcc 将 mydir/test.c 视为不同的两个不同的输入文件名,并且该命令会产生错误。
这是当我取消注释上述 Makefile 的第 4 行和第 5 行时生成的错误输出的屏幕截图:


我的问题:
有没有办法像我一样使用自动变量来保留这些反斜杠?或者是否有任何替代方法可以实现与使用自动变量相同的目标并解决我的问题?因为灵活性在这里很重要。

在此先感谢您的帮助!!!

对自动变量使用双引号或单引号。

如果要避免 shell 扩展自动变量引用的值,请使用单引号:

$(DIR)/test.out: $(DIR)/test.c
    $(CC) '$<' -o '$@'

双引号允许 shell 展开。例如,如果 DIR 中有一个美元符号:

DIR := $$my\ dir

然后 "$@" 将扩展为 "$my dir",并且 shell 会将 $my 解释为变量。