|
|
  |
Ошибка сборки проекта в Sublime text2, Sublime text2, GNU Tools ARM Embedded, makefile |
|
|
|
Aug 3 2014, 16:01
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 22-01-13
Пользователь №: 75 284

|
Не получается собрать простенький проект на С++ в Sublime text2. Использую компилятор gcc(GNU Tools ARM Embedded), программу make с самописным простеньким makefile. Пути для gcc и make прописаны в PATH. Вот что пытаюсь собрать: Код int main() { } Вот настройки проекта sublime text2: Код { "folders": [ { "path": "." } ],
"build_systems": [ { "name": "arm build", "cmd": ["make"], "working_dir": "${project_path}" } ],
"settings": { "sublimeclang_options": [ "-std=c++11", "-Wall", "-I${project_path}" ] } } Содержимое makefile: Код all: arm-none-eabi-gcc main.cpp Вот что получаем на выходе:  Код arm-none-eabi-gcc main.cpp c:/program files (x86)/gnu tools arm embedded/4.8 2014q2/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib\libc.a(lib_a-exit.o): In function `exit': exit.c:(.text.exit+0x2c): undefined reference to `_exit' collect2.exe: error: ld returned 1 exit status make: *** [all] Error 1 [Finished in 0.4s with exit code 2] Как вы думаете, в чем проблема? проект прикрепляю:
Сообщение отредактировал allsettingsdone - Aug 3 2014, 16:03
Прикрепленные файлы
sm20.zip ( 3.46 килобайт )
Кол-во скачиваний: 10
|
|
|
|
|
Aug 3 2014, 16:43
|

Профессионал
    
Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634

|
Ну так библиотек никаких не указано... Обычно в embedded проектах "стартап" включается в него разработчиком. Я, например, предпочитаю чтобы для основной программы неинициализированные переменные уже были "0", это всё (как и работала инициализация - переписывается из flash в ОЗУ) само собой не происходит. Как-то так: Код void ResetException(void) { arm_cpu_initialize(); // watchdog disable, clock initialize
/* copy-init variables */ memcpy(& __data_start__, & __etext, (& __data_end__ - & __data_start__) * sizeof __bss_end__); /* zero-init variables */ memset(& __bss_start__, 0, (& __bss_end__ - & __bss_start__) * sizeof __bss_end__); /* Branch to main function */ main();
/* Infinite loop */ for (;;) ; } Для Вашего случая лекарство вот: Код void _exit(int v) { for (;;) ; }
void exit(int v) { for (;;) ; } Но зашивать в ПЗУ это не получится...
Сообщение отредактировал Genadi Zawidowski - Aug 3 2014, 16:50
|
|
|
|
|
Aug 3 2014, 17:21
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 22-01-13
Пользователь №: 75 284

|
Цитата(Genadi Zawidowski @ Aug 3 2014, 18:43)  ... Дело в том что не нужны костыли в проекте, для того что бы та или иная ошибка не выскакивала. Я бы хотел сделать "скелетный" проект для Sublime text2, и насколько я понимаю, эта ошибка появляется из-за того что я передаю в компилятор слишком мало параметров о самом микроконтроллере, и(или) не подключаю к проекту файл "startup_stm32f10x_md_vl.s". Тут кстати возникает вопрос - как правильно подключить этот файл к проекту? И какая разница компилятору подключен он или нет?
Сообщение отредактировал IgorKossak - Aug 4 2014, 08:44
Причина редактирования: бездумное цитирование
|
|
|
|
|
Aug 3 2014, 19:31
|

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

|
Цитата(allsettingsdone @ Aug 3 2014, 23:21)  Дело в том что не нужны костыли в проекте, для того что бы та или иная ошибка не выскакивала. Я бы хотел сделать "скелетный" проект для Sublime text2 При чём тут вообще Sublime text? Вам надо найти нормальный makefile. Именно из него компилятор и узнает, какие файлы у вас подключены и с какими ключами их компилировать. Например, посмотрите пример от scmRTOS, там есть работающий makefile. (И стартап, про необходимость которого вам сказал Genadi Zawidowski, там тоже есть.)
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 3 2014, 19:40
|
Знающий
   
Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390

|
startup нужен для начальной инициализации процессора (прерываний, стека и т.п.), т.е. для создания окружения в котором уже м.б. запущена функция main. В этом файле обычно содержится нулевой вектор, откуда стартует программа при подаче питания или сбросе, а также вызов функции main. Поскольку ОС отсутствует, программа обычно не возвращает никуда управления, а остается в вечном цикле for(;;){} или while(1) Поскольку он у вас отсутствует, линкер ищет функцию для передачи управления по завершению main Насколько понимаю, Sublime это просто стучалка, у которой есть возможность вызова make для проекта. Самый простой способ разобраться со связкой компилятора и редактора - научиться сначала компилировать проект из командной строки. Например, можно взять референсный код мигания светодиодом или аналогичный для вашего или похожего процессора и научиться собирать его при помощи make. Далее подтянуть редактор. Далее уже заниматься программированием конкретной задачи под конкретный процессор.
|
|
|
|
|
Aug 4 2014, 02:09
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(psL @ Aug 4 2014, 01:40)  startup нужен для начальной инициализации процессора (прерываний, стека и т.п.), т.е. для создания окружения в котором уже м.б. запущена функция main. В этом файле обычно содержится нулевой вектор, откуда стартует программа при подаче питания или сбросе, а также вызов функции main. Стартап не выполняет никакой инициализации аппаратуры (типа прерываний и т.п.), а только готовит программное окружение для выполнения си-кода (инит статитческих/глобальных переменных, памяти, стеков, режимов CPU и т.п.). Аппаратуру можно начинать инитить уже в main().
|
|
|
|
|
Aug 4 2014, 20:17
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 22-01-13
Пользователь №: 75 284

|
Так.. В первую очередь мне надо разобраться с синтаксисом makefile и *.ld , понять что за что отвечает и дальше уже пытаться собрать проект.
|
|
|
|
|
Aug 4 2014, 20:57
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(allsettingsdone @ Aug 5 2014, 00:17)  ...надо разобраться с синтаксисом makefile... ничего сложного в этой бодяге нет. с годами что то добавляется, что то уходит. разные языки(среды), разные обработчики мэйк файлов. но суть одна и та-же. очень поможет какой-либо пример. в инете их как грязи. Вам нужно готовый, с мэйк файлом. потом по образу и подобию пытаетесь запустить своё(как хочется, или как вы кумекаете). нарываетесь на конкретные проблемы. решаете конкретные проблемы. не забываем про встроенные хэлпы, форумы с кучей избытыми вопросами-ответами. как правило, если это не квантовый генератор, для полёта к марсу в единственном полусекретном варианте - то всё уже тысячу раз пройдено другими людьми. надо просто найти ключевые фразы, которые Вас выведут точно на самые полные ответы(для вас)... ну и по кругу, пока сами с усами не станете. Так же не забываем про другие источники инфы - книги, редко научные институтские статьи, иногда для практических рукамидвижений выручает и всевозможные видио - которые сейчас делают все кому не лень, в том числе и народу от техники/электроники/прграммирования... ну где то так...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|