使用make.exe时,有没有办法让目标名称中的空格有效?如果这个非常古老的错误报告是正确的,似乎是不可能的: http://savannah.gnu.org/bugs/?712
作为参考,最大的问题是makefile命令如:
"foo bar baz": $(OBJ)
$(CPP) $(LINKOBJ) -o $(BIN) $(LIBS)
...似乎被视为三个单独的命令:一个用于构建“foo(注意包含”),一个用于构建条,最后一个用于构建baz“(再次,包括”)。这是因为make.exe似乎使用空格作为分隔符。
但是,假设有人可能想要构建“Hello World.exe”是合理的。这似乎不可能。双引号不起作用,也没有逃避单独的单词(我在某处读过,不记得链接):
"foo\\ bar\\ baz": $(OBJ)
$(CPP) $(LINKOBJ) -o $(BIN) $(LIBS)
还有其他方法可以解决这个问题吗?官方手册仅确认按空格标记的内容,但不提供将空间用于任何其他目的的方法: http://www.gnu.org/software/make/manual/make.html#Rule-Syntax
编辑:按照建议,我也尝试过单斜线,但这些效果与双斜线完全相同。抱怨它无法找到第一个单词的规则:
mingw32-make.exe: *** No rule to make target `foo', needed by `all'. Stop.
虽然可以正确生成可执行文件“foo bar baz.exe”,但每次单词都会进行链接。
答案 0 :(得分:1)
而不是双反斜杠使用单反斜杠。以下Makefile有效(至少对于gnu make):
goal: foo\ bar
foo\ bar:
gcc -o "foo bar" "foo bar.c"
答案 1 :(得分:1)
EXECUTABLE=foo\ bar\ baz
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CC) $(OBJECTS) -o "$@" $(LDFLAGS)
注意$ @周围的双引号 在我看来,当make到达目标“$(EXECUTABLE)”时,它会扩展“\”,所以命令行变为
gcc file.o -o foo bar baz -LFlags
这不是你想要的,你想要在文件名周围加上双引号。
现在你在Windows上,我不记得它是如何处理名称中的空格的,所以马蒂亚斯说,首先检查“cmd.exe”如何处理空格(除了用双引号括起来的名字......)
答案 2 :(得分:1)
可能更容易考虑更简单的Makefile,它会忽略标准targetRule: dependencies
调用中的依赖项。 OP适用于Windows,以下是在bash
shell中的Linux上完成的;但我认为它应该适用于使用bash
shell cygwin
的Windows。我在Makefile
中有以下内容(注意,在echo
命令之前应该有 TAB ,SO转换为空格):
testA:
echo "testA"
unrelated:
echo "unrelated"
testA\ clean:
echo "testA clean"
clean:
echo "clean"
如果我使用make
shell终端中的目标clean
或testA
致电bash
,我会得到预期结果:
$ make testA
echo "testA"
testA
$ make clean
echo "clean"
clean
现在,如果我按原样调用make testA clean
,bash
shell将在空格处拆分参数,因此make
将接收两个参数,并将分别运行它们: / p>
$ 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
不会显示为自动填充选项)。< / p>