2

当我为 EXTRAINCDIRS 提供不带空格的路径(在 Makefile 中,遵循 WINAVR 提供的示例)时,编译器能够找到我的头文件,但是当我使用包含空格的路径时(用引号括起来,如注释Makefile 直接),它引发: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 上使用程序员记事本 (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
4

1 回答 1

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 函数来运行它,这些函数与空间分隔符一起工作,而不会发生相同的行为。

于 2012-05-26T14:38:44.783 回答