0

我有这个 Makefile

CC=g++
CFLAGS=-g -c -Wall -o standalone
MYSQLINCLUDE = -I/usr/local/include/mysql
MYSQLINCLUDESP = -I/usr/local/include/
LDFLAGS =-L/usr/local/lib
LDFLAGSSP =-L/usr/local/lib/mysql  -lmysqlclient -lmysqlcppconn
SOURCES= /usr/eval/demo 1/user/demo1/p2/main.cpp 
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=p2
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
    $(CC) $(LDFLAGS) $(LDFLAGSSP) $(OBJECTS) -o $@
.cpp.o:
    $(CC) $(MYSQLINCLUDESP) $(CFLAGS) $< -o $@
clean:
    rm -rf $(OBJECTS) $(EXECUTABLE) *.core

问题出在这条线上

SOURCES= /usr/eval/demo 1/user/demo1/p2/main.cpp 

在 demo 和 1 之间有空格,我得到这个错误

`make: don't know how to make /usr/eval/demo Stop`

这个 Makefile 是从其他程序自动生成的

4

2 回答 2

0

Try to escape:

SOURCES=/usr/eval/demo\ 1/user/demo1/p2/main.cpp

Or use quotes:

SOURCES="/usr/eval/demo 1/user/demo1/p2/main.cpp"
于 2012-05-27T21:04:40.293 回答
0

在 Windows 上的 MSYS 下工作(GNU make 3.79.1)我与这个问题斗争了一段时间,并想出了:

ifndef ESCAPE_PATH
ESCAPE_SPACE = $(subst _,,_ _)
ESCAPE_PATH = $(subst $(ESCAPE_SPACE),\$(ESCAPE_SPACE),$(1))
endif

然后,例如:

PROBLEM = ../problem with spaces.txt

PROBLEM_ESCAPED = $(call ESCAPE_PATH,$(PROBLEM))

$(PROBLEM_ESCAPED):
    date >$(PROBLEM_ESCAPED)

md5: $(PROBLEM_ESCAPED)
    md5sum $(PROBLEM_ESCAPED) >$(PROBLEM_ESCAPED).md5sum

这适用于一个简单的 make 文件,甚至在更复杂的情况下,但我有一个实际项目,它不起作用,并且在一个通用示例中重现来演示并不简单。许多包含文件带来数据、可重用的生成资源、目标等。分配给问题的值也来自包含文件中的其他变量,包括相对于 $(CURDIR) 计算的路径,尽管最终在文件名中解析为一个简单的常量字符串。导致损坏的确切情况是什么尚不清楚,并且至少一次尝试为这篇文章创建示例并没有重现问题(GNU make 无法检测到 $(PROBLEM) 文件已经存在并且不需要重建)。

似乎很清楚(对我来说)文件名中的空格对 GNU make 构成了挑战,没有明显的一刀切解决方案。

于 2014-01-23T18:26:09.297 回答