在GCC makefile的目标中允许空间

在GCC makefile的目标中允许空间,gcc,makefile,mingw,target,space,Gcc,Makefile,Mingw,Target,Space,使用make.exe时,是否有办法使目标名称中的空格起作用?如果这个真正古老的bug报告是正确的,那么这似乎是不可能的: 作为参考,最大的问题是makefile命令如下: "foo bar baz": $(OBJ) $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS) 。。。似乎被视为三个独立的命令:一个用于构建“foo(请注意包含)”,一个用于构建bar,最后一个用于构建baz(同样包括)。这是因为make.exe似乎使用空格作为分隔符 然而,有理由假设您可能想要

使用make.exe时,是否有办法使目标名称中的空格起作用?如果这个真正古老的bug报告是正确的,那么这似乎是不可能的:

作为参考,最大的问题是makefile命令如下:

"foo bar baz": $(OBJ)
    $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS)
。。。似乎被视为三个独立的命令:一个用于构建“foo(请注意包含)”,一个用于构建bar,最后一个用于构建baz(同样包括)。这是因为make.exe似乎使用空格作为分隔符

然而,有理由假设您可能想要构建“helloworld.exe”。这似乎是不可能的。双引号不起作用,转义单独的单词也不起作用(我在某个地方读过,不记得链接):

有没有其他办法解决这个问题?官方手册仅确认了通过空间标记的内容,但未提供将空间用于任何其他用途的方法:

编辑:正如建议的那样,我也尝试了单斜杠,但它们的效果与双斜杠完全相同。投诉第一个词找不到规则:

mingw32-make.exe: *** No rule to make target `foo', needed by `all'.  Stop.

虽然可以正确生成可执行文件“foo bar baz.exe”,但每次都会按单词进行链接。

使用单个单词代替双反斜杠。以下Makefile可以工作(至少对于gnu make):


正如马提亚斯所说,这是一个“\”的问题,但也是一个双引号的问题。以下是我是如何成功做到这一点的:

EXECUTABLE=foo\ bar\ baz
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
                $(CC) $(OBJECTS) -o "$@" $(LDFLAGS)
请注意下面的双引号$@ 在我看来,当make到达目标“$(可执行)”时,它会扩展“\”,因此命令行变为

gcc file.o -o foo bar baz -LFlags
这不是您想要的,您需要在文件名周围加上双引号


现在你在Windows上,我不记得它是如何处理名字中的空格的,所以正如马蒂亚斯所说的,首先检查“CMD.exe”如何处理空格(除了用双引号的周围名字……)/P>< P>也许更容易考虑一个更简单的Mag文件,它忽略了标准<代码> TraceTrule:依赖关系< /代码>调用中的依赖关系。OP是针对Windows的,下面是在Linux上的

bash
shell中完成的;但我想,它应该可以通过
cygwin
应用于使用
bash
shell的Windows。我的
Makefile
中有以下内容(注意,
echo
命令前面应该有一个选项卡,可以将其转换为空格):

如果我在
bash
shell终端中使用targets
clean
testA
调用
make
,我会得到预期的结果:

$ make testA 
echo "testA"
testA
$ make clean
echo "clean"
clean
现在,如果我调用刚刚编写的
make testA clean
,则
bash
shell将在空格处拆分参数,因此
make
将接收两个参数,并分别运行它们:

$ make testA clean
echo "testA"
testA
echo "clean"
clean
。。。但是,如果我将提供给
make
的目标用引号括起来,或者如果我转义了空格,shell将理解它应该是一个内部有空格的单参数,并将其传播到
make
,这将继续执行编写为
testA\clean
目标规则的内容:

$ make "testA clean"
echo "testA clean"
testA clean
$ make testA\ clean
echo "testA clean"
testA clean

这样做的一个后果是,不幸的是,您无法在命令行中“TAB”自动完成
testA\clean
;如果在命令行中键入
make te
TAB,则只有
testA
会自动完成(并且
testA\clean
不会显示为自动完成选项)。

@Orwell:那么,这似乎是操作系统的问题。如何在shell中指定名称中带有空格的文件?还需要引用目标名称中的冒号:
some\:target\name:…
-可能还有其他字符。
$ make testA 
echo "testA"
testA
$ make clean
echo "clean"
clean
$ make testA clean
echo "testA"
testA
echo "clean"
clean
$ make "testA clean"
echo "testA clean"
testA clean
$ make testA\ clean
echo "testA clean"
testA clean