私は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が正しく動作しないと考えています。
あなたが投稿したエラーは、 'main.c'が見つかりませんでした。makefileに関連するソースファイルはどこですか?余分な前処理ステップが必要な理由も明確ではありません。 – user657267
私はmakefileがはるかに精巧で複雑な会社でプロジェクトを作業しています。彼らには多くのステップがありました。一歩前進したファイルを作成して、必要に応じて調べることができました。私はこれが好きで、それが可能であることを知っているので、私はそれを私のプロジェクトに取り入れたいと思っています。現在のところ、avr/io.hの特定のマクロがどのようなものに変換されているのかを知ることは有用でしょう。 – rangeme