2016-06-19 11 views
0

私はavrマイクロコントローラ用のプログラムをコンパイルする以前のプロジェクトからmakefileを取り出しました。私はIOポート/データの指向性アドレスの設定に問題がありました。これは、マイクロコントローラに障害やリセットを引き起こしていました。このため、私は自分のmakefileにステップを追加して、事前に処理されたファイルを生成してから、これらの前処理されたファイルからコンパイルするようにしました。私はあまりにもmakefileでルール/依存関係がどのように機能するかに慣れていないので、makefileがどのように動作するかについての私の理解には間違いがあります。前処理されたファイル/オブジェクトファイル、ひいては.elfファイルを作成する私のルールは間違っていなければなりません。 .elfファイルを作成する前処理されたファイルを作成しようとした手順を追加するまで上手く動作します。ルール/依存関係がmakeでどのように機能するかについての私の単純な間違い/理解は何ですか?makefileに前処理ファイルを生成し、それらのファイルからコンパイルするステップをどのようにすることができますか?

私はこの作業をどのように表示するかは、make allに問い合わせるとled.elfの依存関係があることがわかります。これを作成するには、$(OUTPUT).elf: $(PROCESS_FILES)という行に基づいて前処理されたファイルの依存関係があるので、この行で始まります。私がmake allにしようとすると、私はエラーmake: *** No rule to make target 'main.c', needed by 'main.e'. Stop.を得て、なぜ私は理解しません。誰も私の理解を助けることができますファイルを作る?

SRC_FILES=\ 
main.c led.c comm.c 
#Object files 
PROCESS_FILES=$(SRC_FILES:.c=.e) 
OBJ_FILES=$(PROCESS_FILES:.e=.o) 
#Directories where to look for include files 
INC_DIRS=\ 
-I. \ 
#Output file name 
OUTPUT=led 
#Programmer and port 
PROG=dragon_isp 

PORT=usb 
#Debugging host and port 
DHOST=localhost 
DPORT=6423 
#Compiler related params 
MCU=atmega2560 
CC=avr-gcc 
OBJCOPY=avr-objcopy 
CFLAGS= -mcall-prologues -std=gnu99 -funsigned-char -funsigned bitfields \ 
-fpack-struct -fshort-enums -mmcu=$(MCU) -Wall -Wstrict-prototypes \ 
$(INC_DIRS) 
#Optimization level 
CFLAGS+=-Os 
#Debug info 
CFLAGS+=-gdwarf-2 

#Generate hex file ready to upload 
all: $(OUTPUT).elf 
$(OBJCOPY) -R .eeprom -O ihex $(OUTPUT).elf $(OUTPUT).hex       
#Link output files 
$(OUTPUT).elf: $(PROCESS_FILES) 
    $(CC) $(CFLAGS) $(OBJ_FILES) -o $(OUTPUT).elf -Wl,-Map,$(OUTPUT).map 
#Create object files 
$(PROCESS_FILES): %.e : %.c 
    $(CC) -E $(CFLAGS) $< -o [email protected] 
$(OBJ_FILES): %.o : %.e 
    $(CC) -x $(CFLAGS) $< -o [email protected] 
#Create assembler file of a C source 
%.s: %.c 
    $(CC) -S $(CFLAGS) $< -o [email protected] 
#Cleans all generated files 
clean: 
    rm -f $(OBJ_FILES) 
    rm -f $(OUTPUT).elf 
    rm -f $(OUTPUT).hex 
    rm -f $(OUTPUT).map 

編集:私は私がそのディレクトリ内のmain.cという名前のファイルを持っていないと思うし始めている今、離れて私のコンピュータからですので、私はこれをチェックすることはできませんが、私の問題を考えます。私がしたとしても、makefileの規則を完全には理解していないので、makefileが正しく動作しないと考えています。

+0

あなたが投稿したエラーは、 'main.c'が見つかりませんでした。makefileに関連するソースファイルはどこですか?余分な前処理ステップが必要な理由も明確ではありません。 – user657267

+0

私はmakefileがはるかに精巧で複雑な会社でプロジェクトを作業しています。彼らには多くのステップがありました。一歩前進したファイルを作成して、必要に応じて調べることができました。私はこれが好きで、それが可能であることを知っているので、私はそれを私のプロジェクトに取り入れたいと思っています。現在のところ、avr/io.hの特定のマクロがどのようなものに変換されているのかを知ることは有用でしょう。 – rangeme

答えて

0

私のエラーは、自分のディレクトリにmain.cというファイルがないという事実に由来しています。 OBJ_FILESまたは類似の変数を使いこなしているときにファイルをバックアップし、make cleanでその変数にあるものを削除する行があることを確認してください。

ルールに関しては、私が望むものを達成するために小さな修正を加える必要がありました。私はそれが順番に前処理されたファイルを必要とするオブジェクト・ファイルを必要と見て、その後

$(OUTPUT).elf: $(OBJ_FILES) 
    $(CC) $(CFLAGS) $(OBJ_FILES) -o $(OUTPUT).elf -Wl,-Map,$(OUTPUT).map 

これに

$(OUTPUT).elf: $(PROCESS_FILES) 
    $(CC) $(CFLAGS) $(OBJ_FILES) -o $(OUTPUT).elf -Wl,-Map,$(OUTPUT).map 

を変更しました。

編集:OBJ_FILES=$(PROCESS_FILES:.e=.o)OBJ_FILES=$(SRC_FILES:.c=.o)に変更しました。また、$(PROCESS_FILES)$(OUTPUT).elf: $(OBJ_FILES)に追加したので、ルールは前処理されたファイルとオブジェクトファイルの両方を独立して生成します。この作業を行うには$(OBJ_FILES): %.o : %.e$(OBJ_FILES): %.o : %.cに変更しなければなりませんでした。

+0

あなたは緑のチックをクリックして、あなた自身の答えを受け入れることができます.... –

関連する問題