Перейти к содержанию
    

Ошибка в Makefile

Требуется получить бинарный файл 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

Подскажите, пожалуйста, где собака зарыта?

Изменено пользователем entomolog

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Похоже, что в первом случае подхватывается левая утилита make (то ли от борланда, то ли от майкрософт).

Попробуйте в Вашей среде указать к нужной make абсолютный путь.

Такое со многими уже случалось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Похоже, что в первом случае подхватывается левая утилита make (то ли от борланда, то ли от майкрософт).

Такое со многими уже случалось.

 

Нет, тут всё ок. Для сборки запускаю батник со следующим содержимым:

C:\yagarto-tools-20100703\bin\make.exe all

 

В случае запуска левой утилиты make не компилируется вообще ничего. А тут почему-то пропускается операция линковки.

Изменено пользователем entomolog

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Запуская ld нужно заботиться о путях к библиотекам и прочем геморрое.

Не запускайте ld, запускайте gcc, он более интеллектуален и сам всё сделает.

LD        = arm-none-eabi-gcc

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте прописать правило для сборки elf явно:

hellow.elf: startup_ARMCM3.o main.o system_stm32f10x.o
    $(LD) $(LDFLAGS) startup_ARMCM3.o main.o system_stm32f10x.o -o hellow.elf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Запуская ld нужно заботиться о путях к библиотекам и прочем геморрое.

Не запускайте ld, запускайте gcc, он более интеллектуален и сам всё сделает.

LD        = arm-none-eabi-gcc

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

 

Попробуйте прописать правило для сборки 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 $@

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

 

Всем спасибо за помощь !

Изменено пользователем entomolog

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Всем спасибо за помощь !

Вы так быстро откланялись, :) а ведь ответа не было...

Насколько я понимаю, у Вас для создания файла 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, при наличии которого он подробно сообщает, что и почему делает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...