Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ошибка в Makefile
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
entomolog
Требуется получить бинарный файл hellow.bin

Исходными файлами являются:
startup_ARMCM3.asm
system_stm32f10x.c
main.c

Набросал следующий Makefile

Код
all: hellow.bin

hellow.bin: hellow.elf
hellow.elf: startup_ARMCM3.o main.o system_stm32f10x.o
startup_ARMCM3.o: startup_ARMCM3.asm
main.o: main.c
system_stm32f10x.o: system_stm32f10x.c

CC        = arm-none-eabi-gcc
AS        = arm-none-eabi-as
LD        = arm-none-eabi-ld
OC        = arm-none-eabi-objcopy

CCFLAGS   = -mcpu=cortex-m3 -mthumb  -Wall -c
ASFLAGS   = -mcpu=cortex-m3  -mthumb -mapcs-32 -gstabs
LDFLAGS   = -v -T gcc_arm.ld
OCFLAGS   = -O binary

%.o: %.c
    $(CC)  $(CCFLAGS) $< -o $@

%.o: %.asm
    $(AS)  $(ASFLAGS) $< -o $@

%.elf: %.o
    $(LD) $(LDFLAGS) $< -o $@

%.bin: %.elf
    $(OC) $(OCFLAGS) $< $@

.PHONY:    all clean
.DEFAULT:
.SUFFIXES:


В результате получаю следующее:

Код
arm-none-eabi-as  -mcpu=cortex-m3  -mthumb -mapcs-32 -gstabs startup_ARMCM3.asm -o startup_ARMCM3.o
arm-none-eabi-gcc  -mcpu=cortex-m3 -mthumb  -Wall -c main.c -o main.o
arm-none-eabi-gcc  -mcpu=cortex-m3 -mthumb  -Wall -c system_stm32f10x.c -o system_stm32f10x.o
arm-none-eabi-objcopy -O binary  hellow.elf hellow.bin
arm-none-eabi-objcopy: 'hellow.elf': No such file
make: *** [hellow.bin] Error 1


При сборке вручную всё в порядке:

Код
I:\CORTEX_M3\WORK_SPACE\hellow_world_2>arm-none-eabi-as  -mcpu=cortex-m3  -mthumb -mapcs-32 -gstabs startup_ARMCM3.asm -o startup_ARMCM3.o

I:\CORTEX_M3\WORK_SPACE\hellow_world_2>arm-none-eabi-gcc  -mcpu=cortex-m3 -mthumb  -Wall -c main.c -o main.o

I:\CORTEX_M3\WORK_SPACE\hellow_world_2>arm-none-eabi-gcc  -mcpu=cortex-m3 -mthumb  -Wall -c system_stm32f10x.c -o system_stm32f10x.o

I:\CORTEX_M3\WORK_SPACE\hellow_world_2>arm-none-eabi-ld -v -T gcc_arm.ld startup_ARMCM3.o main.o system_stm32f10x.o  -o hellow.elf
GNU ld (GNU Binutils) 2.21

I:\CORTEX_M3\WORK_SPACE\hellow_world_2>arm-none-eabi-objcopy -O binary  hellow.elf hellow.bin


GCC toolchain - YAGARTO
Подскажите, пожалуйста, где собака зарыта?
IgorKossak
Похоже, что в первом случае подхватывается левая утилита make (то ли от борланда, то ли от майкрософт).
Попробуйте в Вашей среде указать к нужной make абсолютный путь.
Такое со многими уже случалось.
entomolog
Цитата(IgorKossak @ Jun 18 2012, 20:25) *
Похоже, что в первом случае подхватывается левая утилита make (то ли от борланда, то ли от майкрософт).
Такое со многими уже случалось.


Нет, тут всё ок. Для сборки запускаю батник со следующим содержимым:
Код
C:\yagarto-tools-20100703\bin\make.exe all


В случае запуска левой утилиты make не компилируется вообще ничего. А тут почему-то пропускается операция линковки.
IgorKossak
Запуская ld нужно заботиться о путях к библиотекам и прочем геморрое.
Не запускайте ld, запускайте gcc, он более интеллектуален и сам всё сделает.
Код
LD        = arm-none-eabi-gcc
AHTOXA
Попробуйте прописать правило для сборки elf явно:
Код
hellow.elf: startup_ARMCM3.o main.o system_stm32f10x.o
    $(LD) $(LDFLAGS) startup_ARMCM3.o main.o system_stm32f10x.o -o hellow.elf
entomolog
Цитата(IgorKossak @ Jun 18 2012, 20:43) *
Запуская ld нужно заботиться о путях к библиотекам и прочем геморрое.
Не запускайте ld, запускайте gcc, он более интеллектуален и сам всё сделает.
Код
LD        = arm-none-eabi-gcc

Тогда бы не линковалось вручную. Попробывал, результат анологичен.

Цитата(AHTOXA @ Jun 18 2012, 21:39) *
Попробуйте прописать правило для сборки elf явно:
Код
hellow.elf: startup_ARMCM3.o main.o system_stm32f10x.o
    $(LD) $(LDFLAGS) startup_ARMCM3.o main.o system_stm32f10x.o -o hellow.elf


Если так, то всё ок, собирает без проблем.
Но всё же, что не так в неявной записи ?
entomolog
Проблема решилась методом тыка, если запись изменить на следующую, то всё линкуется.
Код
%.elf: *.o
    $(LD) $(LDFLAGS) $^ -o $@

Незнаю правильно так или нет, но работает.

Всем спасибо за помощь !
alx2
Цитата(entomolog @ Jun 19 2012, 01:51) *
Незнаю правильно так или нет, но работает.
Всем спасибо за помощь !

Вы так быстро откланялись, sm.gif а ведь ответа не было...
Насколько я понимаю, у Вас для создания файла elf использовался шаблон:
Код
%.elf: %.o
        $(LD) $(LDFLAGS) $< -o $@

Этот шаблон (для цели hellow.elf) означает, что файл hellow.elf может быть получен из файла hellow.o. Но в вашем проекте нет модуля hellow.c и, соответственно, нет файла hellow.o! Такуим образом, make не может использовать это правило для получения hellow.elf. Наличие же строчки hellow.elf: startup_ARMCM3.o main.o system_stm32f10x.o приводит make к выводу о том, что для создания hellow.elf не требуется выполнять никаких действий.

Я бы посоветовал вместо шаблона задать правило для линковки примерно так:
Код
OBJ = startup_ARMCM3.o main.o system_stm32f10x.o
  .....
hellow.elf: $(OBJ)
        $(LD) $(LDFLAGS) $^ -o $@

И еще напоминаю о наличии у GNU make (а Вы, как я понял, используете именно его) ключа -d, при наличии которого он подробно сообщает, что и почему делает.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.