0

この makefile は、ARM マイクロコントローラ用の hex ファイルを作成するためのものです。私のmakefileは、フォルダーに保持されているすべてのcファイルを取得し、hexファイルを生成します。hex ファイル、.obj ファイルなどは bin フォルダーに配置されます。

フォルダー内に c ファイルが 1 つしかない場合、makefile は正常に動作します (つまり、hex ファイル、.obj ファイルなどを表示できます)。しかし、フォルダーに複数の c ファイルを配置すると、ビルドが失敗します。以下は、複数の c ファイルがある場合に発生するエラーです。

arm-none-eabi-gcc: error: main.o: No such file or directory
make: *** [32bitTimer.elf] Error 1

参照用にメイクファイルを添付しています。

複数の c ファイルで機能しない理由を教えてください。

## makefile

BINARY   = 32bitTimer
LDSCRIPT = stm32f4-discovery.ld

SRCS     = $(wildcard *.c)
OBJDIR   = bin

PREFIX  = arm-none-eabi
CC  = $(PREFIX)-gcc
LD  = $(PREFIX)-gcc
OBJCOPY = $(PREFIX)-objcopy
OBJDUMP = $(PREFIX)-objdump
GDB = $(PREFIX)-gdb

TOOLCHAIN_DIR ?= ../libopencm3

CFLAGS      += -Os -g \
            -Wall -Wextra -Wimplicit-function-declaration \
            -Wredundant-decls -Wmissing-prototypes -Wstrict-prototypes \
            -Wundef -Wshadow \
            -I$(TOOLCHAIN_DIR)/include \
            -fno-common -mcpu=cortex-m4 -mthumb \
            -mfloat-abi=hard -mfpu=fpv4-sp-d16 -MD -DSTM32F4
LDFLAGS     += --static -lc -lnosys -L$(TOOLCHAIN_DIR)/lib \
            -L$(TOOLCHAIN_DIR)/lib/stm32/f4 \
            -T$(LDSCRIPT) -nostartfiles -Wl,--gc-sections \
            -mthumb -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16
OBJS        = $(SRCS:.c=.o)

# Be silent per default, but 'make V=1' will show all compiler calls.
ifneq ($(V),1)
Q := @
endif

all: $(OBJDIR) $(BINARY).images

%.images: %.elf
    $(Q)$(OBJCOPY) -Obinary $(OBJDIR)/$(*).elf   $(OBJDIR)/$(*).bin
    $(Q)$(OBJCOPY) -Oihex   $(OBJDIR)/$(*).elf   $(OBJDIR)/$(*).hex
    $(Q)$(OBJCOPY) -Osrec   $(OBJDIR)/$(*).elf   $(OBJDIR)/$(*).srec
    $(Q)$(OBJDUMP) -S       $(OBJDIR)/$(*).elf > $(OBJDIR)/$(*).list

$(BINARY).elf:  $(OBJS) $(LDSCRIPT) $(TOOLCHAIN_DIR)/lib/libopencm3_stm32f4.a
    $(Q)$(LD) -o $(OBJDIR)/$(BINARY).elf $(OBJDIR)/$(OBJS) -lopencm3_stm32f4 $(LDFLAGS)

%.o:%.c
    $(Q)$(CC) $(CFLAGS) -o $(OBJDIR)/$@ -c $<

$(OBJDIR):
    $(Q)mkdir $(OBJDIR)

clean:
    $(Q)rm -rf $(OBJDIR)

.PHONY: images clean
4

1 に答える 1

1

これはおそらく最も直接的な問題です: 開始行には$(Q)$(LD) -o $(OBJDIR)次のテキストがあります:

$(OBJDIR)/$(OBJS)

これは、あなたが期待する (ように見える) ことをしません。これは、 の文字列値を の文字列値に追加するだけ$(OBJDIR)です$(OBJS)。実際には、後者の各単語にプレフィックスを付けているわけではありません。おそらく、代わりに次のように言いたいでしょう:

$(patsubst %,$(OBJDIR)/%,$(OBJS))

これにより、各単語の前$(OBJS)に の値が付け$(OBJDIR)られ、その後にスラッシュが続きます。

于 2013-12-23T22:09:56.997 に答える