WINAVR не находит файл во включаемом пути с пробелами
Когда я предоставляю путь для 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 справиться с этим правильно?
Я использую Блокнот программиста (WINAVR) на Windows XP. Вот команда командной строки:
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 ответ
Происходит то, что я предполагаю, что где-то еще в make-файле есть строка, которая делает что-то вроде следующего:
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))
Если это не имеет смысла, вы можете опубликовать весь make-файл, и мы можем точно показать вам, что происходит. После того, как пространство было подставлено обратно в переменную, вы не сможете запускать его через любые другие функции make, которые работают с разделителями пробелов без возникновения такого же поведения.