реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Ошибка в Makefile, При сборке, make пропускает операцию, помогите разобраться
entomolog
сообщение Jun 18 2012, 17:15
Сообщение #1





Группа: Участник
Сообщений: 13
Регистрация: 27-05-08
Из: Харьков
Пользователь №: 37 844



Требуется получить бинарный файл 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 - Jun 18 2012, 17:16
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jun 18 2012, 17:25
Сообщение #2


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Похоже, что в первом случае подхватывается левая утилита make (то ли от борланда, то ли от майкрософт).
Попробуйте в Вашей среде указать к нужной make абсолютный путь.
Такое со многими уже случалось.
Go to the top of the page
 
+Quote Post
entomolog
сообщение Jun 18 2012, 17:29
Сообщение #3





Группа: Участник
Сообщений: 13
Регистрация: 27-05-08
Из: Харьков
Пользователь №: 37 844



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


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


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

Сообщение отредактировал entomolog - Jun 18 2012, 17:31
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jun 18 2012, 17:43
Сообщение #4


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Запуская ld нужно заботиться о путях к библиотекам и прочем геморрое.
Не запускайте ld, запускайте gcc, он более интеллектуален и сам всё сделает.
Код
LD        = arm-none-eabi-gcc
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 18 2012, 18:39
Сообщение #5


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Попробуйте прописать правило для сборки elf явно:
Код
hellow.elf: startup_ARMCM3.o main.o system_stm32f10x.o
    $(LD) $(LDFLAGS) startup_ARMCM3.o main.o system_stm32f10x.o -o hellow.elf


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
entomolog
сообщение Jun 18 2012, 19:28
Сообщение #6





Группа: Участник
Сообщений: 13
Регистрация: 27-05-08
Из: Харьков
Пользователь №: 37 844



Цитата(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 - Jun 18 2012, 20:05
Go to the top of the page
 
+Quote Post
entomolog
сообщение Jun 18 2012, 20:51
Сообщение #7





Группа: Участник
Сообщений: 13
Регистрация: 27-05-08
Из: Харьков
Пользователь №: 37 844



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

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

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

Сообщение отредактировал entomolog - Jun 18 2012, 21:00
Go to the top of the page
 
+Quote Post
alx2
сообщение Jun 19 2012, 06:12
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(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, при наличии которого он подробно сообщает, что и почему делает.


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 07:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01431 секунд с 7
ELECTRONIX ©2004-2016