2013-12-23 112 views
0

此makefile用於爲ARM微控制器生成hex文件。我的makefile將保存在文件夾中的所有c文件並生成hex文件。十六進制文件,.obj文件等被放置在bin文件夾中。Makefile不適用於多個c文件,但適用於單個c文件

當文件夾內只有一個c文件時,我的makefiles工作正常(即能夠看到十六進制文件,.obj文件等)。但如果我在文件夾中放置多個c文件,則構建失敗。下面是我有多個c文件時得到的錯誤。

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

我附上我的makefile以供參考。

請讓我知道爲什麼它不適用於多個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)/[email protected] -c $< 

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

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

.PHONY: images clean 

回答

1

這可能是最直接的問題:在啓動$(Q)$(LD) -o $(OBJDIR)行你有文字:

$(OBJDIR)/$(OBJS) 

這不會做你(好像)期待。這只是將字符串值$(OBJDIR)附加到字符串值$(OBJS)。這實際上並不是後者中每個詞的前綴。你可能就要這樣說:

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

將前綴$(OBJS)每個字與後跟斜槓的$(OBJDIR)值。

+0

非常感謝分類!有效。 – robomon

+0

還有一個問題。你能回答嗎?每次做make時,即使源文件沒有改變,文件也會被一次又一次地編譯。根據我的理解,make只會編譯僅被更改的文件。當我們第一次運行make時,它會生成十六進制文件。但下一次,如果我們跑步,它應該顯示一些警告說:「沒有規則制定目標」(我不記得確切的警告)。你知道它爲什麼沒有顯示嗎?是否因爲我在與源代碼不同的文件夾中構建了十六進制? – robomon

+1

如果沒有更多信息,很難分辨發生了什麼。考慮發佈另一個問題,所以你可以用例子的makefile代碼和運行的腳本來補充這個問題。 – danfuzz

相關問題