2012-05-27 91 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來說是一個挑戰,因爲它沒有明顯的一刀切的解決方案。