这是我关于Stackoverflow的第一个问题,请原谅我,如果我问一些荒谬的话:D。
的问题:
假设我想编译一个位于“my dir /”目录中的程序,其中包含一个空格。假设程序的路径名是“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
这是一种语法正确的传递文件名的方法(带空格)到 gcc 或任何其他shell命令。
第二行(第4行)是问题所在(注释行)。我使用了自动变量$ @(Target)和$&lt; (第一个也是唯一的先决条件)为 gcc 生成文件名参数,我希望是 my \ dir / test.out 和 my \ dir / test.c ,分别。但是在这里,出于某种原因,生成的文件名是 my dir / test.out 和 my dir / test.c ,因此产生的命令是:
< strong> gcc my dir / test.c -o my dir / test.out
现在,gcc将我的和 dir / test.c 视为不同的两个不同的输入文件名,并且该命令会生成错误。
下面是我取消注释上述Makefile的第4行和第5行注释时生成的错误输出的屏幕截图:
我的问题:
有没有办法保留那些反斜杠,即使使用自动变量也是如此?或者是否有任何替代方案可以实现与使用自动变量相同的目标并解决我的问题?因为灵活性在这里很重要。
在此先感谢您的帮助!!!
答案 0 :(得分:1)
对自动变量使用双引号或单引号。
如果要避免自动变量引用的值的shell扩展,请使用单引号:
$(DIR)/test.out: $(DIR)/test.c
$(CC) '$<' -o '$@'
双引号允许shell扩展。例如,如果DIR
中有美元符号:
DIR := $$my\ dir
然后"$@"
会扩展为"$my dir"
,而shell会将$my
解释为变量。