2012-05-27 59 views
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 [email protected] 
.cpp.o: 
    $(CC) $(MYSQLINCLUDESP) $(CFLAGS) $< -o [email protected] 
clean: 
    rm -rf $(OBJECTS) $(EXECUTABLE) *.core 

的问题是此行

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

与演示和1之间的空间,我得到这个错误

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

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

+1

一般而言,您不能在make中使用包含空格(或冒号)的文件名。 – MadScientist

+0

是的,它至少接缝非常混乱,也许这个http://stackoverflow.com/questions/668322/what-is-the-most-reliable-way-of-using-gnumake-with-filenames-containing-spaces问题可以帮助 –

回答

0

试图逃跑:

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

或者使用引号:

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

我试试这个'SOURCES =/usr/eval/demo \ 1/user/demo1/p2/main.cpp; SOURCES =“/ usr/eval/demo 1/user/demo1/p2/main.cpp”; SOURCES =“/ usr/eval/demo \ 1/user/demo1/p2/main.cpp”但不起作用 – xnl96

0

在Windows MSYS下工作(GNU使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文件中工作,甚至在更复杂的情况下也可以工作,但是我有一个真正的项目,它不起作用,并且在一个通用示例中进行演示并不容易。许多包含文件带入数据,可重复使用的资源,目标等。分配给PROBLEM的值也来自包含文件中的其他变量,包括相对于$(CURDIR)计算的路径,尽管最终以文件名解析为一个简单的常量字符串。导致破坏的确切情况是未知的,并且至少有一次尝试创建此示例并没有重现该问题(GNU make无法检测到$(PROBLEM)文件已存在并且不需要 被重建)。

对我来说看起来很清楚(在我看来)文件名中的空格对于GNU make来说是一个挑战,因为它没有明显的一刀切的解决方案。