5

以下是我的 Makefile:

.PHONY: all

all: /Users/wu/qqaa/homepage\ 1\ 2\ 3/icons\ (a-b)
        @tar cjvf 1.tar.bz2 --exclude=*~ /Users/wu/qqaa/homepage\ 1\ 2\ 3/icons\ \(a-b\)

它没有用。问题是依赖中的括号。\之前添加()也没有工作。错误是这样的:

make: *** No rule to make target `/Users/wu/qqaa/homepage 1 2 3/icons (a-b)', needed by `all'. Stop

目录 /Users/wu/qqaa/homepage 1 2 3/icons (ab) 确实存在。似乎不能在依赖中使用括号。这是对的吗?还是我错过了什么?

听起来冒号也不能依赖使用。

我写了一个 bash shell 脚本来备份我的系统。我用makeandtar来备份。使用make是仅更新较新的文件并 tar 目录。问题是许多文件的名称都有冒号或括号,它们在 Makefile 中具有特殊含义。导致上述问题。

我真的很感激任何帮助。谢谢你。

4

2 回答 2

5

问题是括号标记存档成员并且似乎是不可避免的。通常的技巧是反斜杠转义和使用变量转义:

.PHONY : all
leftparen:=(
rightparen:=)
all: /Users/wu/qqaa/homepage\ 1\ 2\ 3/icons\ $(leftparen)a-b$(rightparen)
        @tar cjvf 1.tar.bz2 --exclude=*~ "$@"

而且由于在这种情况下两者都不起作用,您可能不得不忍受这个限制或提交一个针对 GNU make 的错误。

于 2011-11-10T13:03:27.430 回答
0

对我来说,我在 Windows 中使用的 Makefile 遇到了这个问题。编译器是 MinGW64-W32 的 32 位版本。

gcc --version显示: gcc (i686-posix-sjlj-rev0, Built by MinGW-W64 project) 5.1.0

make --version显示:GNU Make 3.81

我正在编写一个需要包含已更改目录的 Makefile(即,32 位编译器的包含目录与 64 位编译器的包含目录不同)。我需要包括以下内容: -IC:/Program Files (x86)/mingw-w64/gtk+-3.6.4_win32/include/gtk-3.0

例如。我遇到了同样的问题,当我尝试编译时,编译器会在第 0 行或其他地方出错。我的解决方案很简单。我只需要使用双引号,如下所示:

-I"C:/Program Files (x86)/mingw-w64/gtk+-3.6.4_win32/include/gtk-3.0"

使用双引号有效。它使我能够成功编译我的程序。

这里有一个旁注。通常,在 Linux 中,对于带有空格的目录,我们需要如下内容:

-I"C:/Program\ Files\ (x86)/mingw-w64/gtk+-3.6.4_win32/include/gtk-3.0"

与空格前的 \。在 Makefile 中,如果我使用 \'s 表示空格,并带有双引号,则程序无法编译。 当我使用双引号时,我相信 Makefile 认为 \'s 实际上是目录名称的一部分。

对于您的代码,请尝试以下操作:

.PHONY: all

all: /Users/wu/qqaa/homepage\ 1\ 2\ 3/icons\ (a-b)
        @tar cjvf 1.tar.bz2 --exclude=*~ "/Users/wu/qqaa/homepage 1 2 3/icons (a-b)"

如果这不起作用,请尝试以下操作:

.PHONY: all

all: /Users/wu/qqaa/homepage\ 1\ 2\ 3/icons\ (a-b)
        @tar cjvf 1.tar.bz2 --exclude=*~ "/Users/wu/qqaa/homepage\ 1\ 2\ 3/icons\ (a-b)"

无论如何,祝你好运。

于 2015-08-21T21:43:01.320 回答