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

Ошибка сборки проекта в Sublime text2

Не получается собрать простенький проект на С++ в 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

 

Вот что получаем на выходе:

h_1407081753_3064171_a56bfa00cf.jpg

 

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]

 

Как вы думаете, в чем проблема?

 

проект прикрепляю:

sm20.zip

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

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


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

Ну так библиотек никаких не указано... Обычно в 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

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


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

...

Дело в том что не нужны костыли в проекте, для того что бы та или иная ошибка не выскакивала. Я бы хотел сделать "скелетный" проект для Sublime text2, и насколько я понимаю, эта ошибка появляется из-за того что я передаю в компилятор слишком мало параметров о самом микроконтроллере, и(или) не подключаю к проекту файл "startup_stm32f10x_md_vl.s". Тут кстати возникает вопрос - как правильно подключить этот файл к проекту? И какая разница компилятору подключен он или нет?

Изменено пользователем IgorKossak
бездумное цитирование

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


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

Дело в том что не нужны костыли в проекте, для того что бы та или иная ошибка не выскакивала. Я бы хотел сделать "скелетный" проект для Sublime text2

При чём тут вообще Sublime text? Вам надо найти нормальный makefile. Именно из него компилятор и узнает, какие файлы у вас подключены и с какими ключами их компилировать.

Например, посмотрите пример от scmRTOS, там есть работающий makefile. (И стартап, про необходимость которого вам сказал Genadi Zawidowski, там тоже есть.)

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


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

startup нужен для начальной инициализации процессора (прерываний, стека и т.п.), т.е. для создания окружения в котором уже м.б. запущена функция main. В этом файле обычно содержится нулевой вектор, откуда стартует программа при подаче питания или сбросе, а также вызов функции main.

Поскольку ОС отсутствует, программа обычно не возвращает никуда управления, а остается в вечном цикле for(;;){} или while(1) Поскольку он у вас отсутствует, линкер ищет функцию для передачи управления по завершению main

Насколько понимаю, Sublime это просто стучалка, у которой есть возможность вызова make для проекта. Самый простой способ разобраться со связкой компилятора и редактора - научиться сначала компилировать проект из командной строки. Например, можно взять референсный код мигания светодиодом или аналогичный для вашего или похожего процессора и научиться собирать его при помощи make. Далее подтянуть редактор. Далее уже заниматься программированием конкретной задачи под конкретный процессор.

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


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

Вот Makefile проект под STM32F1xx - только запуск. Обратите внимание на размер ПЗУ и ОЗУ в файле *.ld

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

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


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

startup нужен для начальной инициализации процессора (прерываний, стека и т.п.), т.е. для создания окружения в котором уже м.б. запущена функция main. В этом файле обычно содержится нулевой вектор, откуда стартует программа при подаче питания или сбросе, а также вызов функции main.

Стартап не выполняет никакой инициализации аппаратуры (типа прерываний и т.п.), а только готовит программное окружение для выполнения си-кода

(инит статитческих/глобальных переменных, памяти, стеков, режимов CPU и т.п.).

Аппаратуру можно начинать инитить уже в main().

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


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

Так.. В первую очередь мне надо разобраться с синтаксисом makefile и *.ld , понять что за что отвечает и дальше уже пытаться собрать проект.

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


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

...надо разобраться с синтаксисом makefile...

 

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

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

подобию пытаетесь запустить своё(как хочется, или как вы кумекаете). нарываетесь на конкретные проблемы. решаете конкретные проблемы.

не забываем про встроенные хэлпы, форумы с кучей избытыми вопросами-ответами. как правило, если это не квантовый генератор, для полёта

к марсу в единственном полусекретном варианте - то всё уже тысячу раз пройдено другими людьми. надо просто найти ключевые фразы,

которые Вас выведут точно на самые полные ответы(для вас)... ну и по кругу, пока сами с усами не станете. Так же не забываем про другие

источники инфы - книги, редко научные институтские статьи, иногда для практических рукамидвижений выручает и всевозможные видио - которые

сейчас делают все кому не лень, в том числе и народу от техники/электроники/прграммирования...

 

ну где то так...

 

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


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

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

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

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

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

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

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

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

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

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