在GCC makefile的目标中允许空间
使用make.exe时,是否有办法使目标名称中的空格起作用?如果这个真正古老的bug报告是正确的,那么这似乎是不可能的: 作为参考,最大的问题是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似乎使用空格作为分隔符 然而,有理由假设您可能想要
"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终端中使用targetsclean
或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