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 で 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
4

1 に答える 1

1

何が起こっているのかというと、メイクファイルのどこかに次のような行があると推測しています。

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 関数を実行することはできません。

于 2012-05-26T14:38:44.783 に答える