2012-05-26 44 views
2

當我爲EXTRAINCDIRS(在Makefile中,跟在WINAVR提供的示例之後)提供一個沒有空格的路徑時,編譯器能夠找到我的頭文件,但是當我使用路徑包含空格(用引號括起來,作爲Makefile指令中的註釋),它引發:error: No such file or directoryWINAVR找不到包含空白的文件中的文件

"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的記事本(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 

回答

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,我們可以告訴你到底發生了什麼。一旦空間被替換回變量中,您就無法通過任何其他使用空格分隔符的函數來運行它,而不會發生相同的行爲。

+0

謝謝。但是有什麼方法可以使用包含空格的通配符?如果可能的話,使用''[^「] +」'這樣的模式會更容易。 – JellicleCat

+0

如果您瞭解make的基礎知識,請參閱gnu make手冊中有關通配符的第4.4節。幫你 – ThePosey

相關問題