2013-12-23 3 views
0

이 메이크 파일은 ARM 마이크로 컨트롤러 용 16 진수 파일을 만들기위한 것입니다. 내 메이크 파일은 폴더에 저장된 모든 c 파일을 가져와 16 진수 파일을 생성합니다. 16 진수 파일, .obj 파일 등은 bin 폴더에 저장됩니다.Makefile이 여러 c 파일에서는 작동하지 않지만 단일 c 파일에서는 작동합니다.

내 makefile이 잘 작동합니다 (즉, 16 진수 파일, .obj 파일 등을 볼 수 있습니다). 폴더 안에 하나의 c 파일 만 있으면됩니다. 그러나 폴더에 둘 이상의 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)/[email protected] -c $< 

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

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

.PHONY: images clean 

답변

1

이 아마 가장 직접적인 문제 : 이것은 당신이 (것) 기대하지 않습니다

$(OBJDIR)/$(OBJS) 

: $(Q)$(LD) -o $(OBJDIR)를 시작하는 줄에 텍스트를 가지고있다. 이것은 $(OBJDIR)의 문자열 값을 $(OBJS)의 문자열 값에 추가합니다. 실제로 각 단어 앞에 접두어가 붙지는 않습니다. 당신은 아마 이런 말을 대신합니다 : 다음에 슬래시가 $(OBJDIR)의 값 $(OBJS)의 각 단어를 접두사합니다

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

.

+0

명료화에 감사드립니다. 그것은 효과가 있었다. – robomon

+0

질문이 하나 더 있습니다. 대답 해 주실 수 있겠습니까? 매번 make를 할 때마다 소스 파일이 변경되지 않아도 파일은 계속해서 컴파일됩니다. 내 이해에 따라 make는 변경된 파일 만 컴파일합니다. 우리가 make를 실행할 때 처음으로 16 진수 파일을 생성합니다. 그러나 다음에 우리가 달리면 "목표를 정하기위한 규칙 없음"이라는 경고가 나타납니다 (정확한 경고는 기억이 안납니다). 왜 보이지 않는지 아십니까? 내가 소스와 다른 폴더에 헥스를 작성했기 때문입니까? – robomon

+1

정보가 없으면 무슨 일이 벌어 지는지 말하기가 어렵습니다. 다른 질문을 올리는 것을 고려하십시오, 그래서 당신은 예제 makefile 코드와 실행 기록을 가지고 이것을 살살 할 수 있습니다. – danfuzz

관련 문제