当我提供EXTRAINCDIRS的路径(在Makefile中,在WINAVR提供的示例之后)没有空格时,编译器能够找到我的头文件,但是当我使用包含空格的路径时(用引号括起来,如在Makefile direct中的注释),它引发了:error: No such file or directory
。
"d:/dev/avr/atmega/shared/" # will search files in this dir
"d:/dev/avr/atmega/sha ed/" # will not search this dir for files
我的意思是,评论说:
# List any extra directories to look for include files here.
# Each directory must be seperated by a space.
# Use forward slashes for directory separators.
# For a directory that has spaces, enclose it in quotes.
知道如何让WINAVR正确处理这个问题吗?
我在Windows XP上使用Programmer's Notepad(WINAVR)。这是命令行命令:
avr-g++ -c -mmcu=atmega328p -I. -gdwarf-2 -DF_CPU=UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./main.lst -I"d:/dev/avr/atmega/shared/" -I"d:/dev/avr/atmega/sha -Ied/" -std=gnu99 -MMD -MP -MF .dep/main.o.d main.c -o main.o
答案 0 :(得分:1)
发生的事情是我猜测makefile中的其他地方有一行代码如下:
INCLUDES = $(addprefix -I, $(INCDIRS))
当发生这种情况时,addprefix会将$(INCDIRS)变量中的任何空格视为下一个变量的分隔符,并在其中添加-I。您可以做的是为空格使用特殊字符'\\',然后在生成命令之前调用替换函数来重新替换空格。类似下面的例子:
SPACE = \\
INCDIRS = /home/posey/test$(SPACE)dir
INCLUDES = $(addprefix -I, $(INCDIRS))
REAL_INCLUDES = $(subst $(SPACE), ,$(INCLUDES))
.PHONY : all
all:
$(info $(REAL_INCLUDES))
如果这没有意义,你可以发布整个makefile,我们可以准确地告诉你发生了什么。一旦空间被替换回变量,就无法通过任何进一步的make函数运行它,这些函数可以使用空格分隔符而不会发生相同的行为。