我有这个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是从其他程序自动生成的
答案 0 :(得分:0)
试着逃避:
SOURCES=/usr/eval/demo\ 1/user/demo1/p2/main.cpp
或使用引号:
SOURCES="/usr/eval/demo 1/user/demo1/p2/main.cpp"
答案 1 :(得分: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文件,即使在更复杂的情况下,但我有一个不起作用的真实项目,并且在一个通用示例中重现并不简单。许多包含文件引入数据,可重复使用make资源,目标等。分配给PROBLEM的值也是从包含文件中的其他变量派生的,包括相对于$(CURDIR)计算的路径,尽管最终是文件名解析为一个简单的常量字符串。什么导致破坏的确切情况是未知的,并且至少有一次尝试为这篇文章创建和示例没有重现问题(GNU make无法检测到$(问题)文件已经存在且不需要 被重建)。
对我来说,文件名中的空格似乎很明显对GNU make提出了挑战,因为没有明显的“一刀切”的解决方案。