LoopFillZerobss имеет неопределенную ссылку на основной

Я компилирую приложение c ++ для микроконтроллера STM32F4.
Весь мой код успешно компилируется, но шаг ссылки завершается неудачно с
следующая ошибка:

/tmp/ccGj7Wge.o: In function `LoopFillZerobss':
(.text.Reset_Handler+0x32): undefined reference to `main'
collect2: error: ld returned 1 exit status

Я знаком с типичной причиной неопределенной ссылки на основные ошибки,
то есть, пытаясь скомпилировать приложение без основного подарка вообще.
Тем не менее, у меня есть main.cpp и, естественно, основная функция внутри него.
Он компилируется в main.o и связан с другими созданными объектными файлами.
во время компиляции.

Я кросс-компиляции на STM32F407, и я бегу голый металл.

Кто-нибудь имел представление об этом или видел эту ошибку раньше? Единственное место, где я вижу LoopFillZerobss
Функция находится в файле запуска сборки для платы.

0

Решение

Вещи, чтобы проверить:

  • Убедитесь, что вы заявляете main правильно. Например, int main(void) или же int main(int argc, char **argv), и не void main(void), Эта статья переполнения стека делает большую работу: Что такое правильное объявление основного?
  • Убедитесь, что вы случайно не завернули main в namespace,
  • Если у вас исключительно необычный компилятор C ++, вы может нужно отметить main как extern "C"Но, честно говоря, я никогда не видел инструментов, которые нуждались в этом.

Вы должны быть в состоянии увидеть, какие символы были определены вашим main.o запустив такой инструмент, как nm в теме. (По крайней мере, цепочки инструментов в стиле UNIX, такие как цепочка инструментов GNU, предлагают nm инструмент.) nm перечислит набор символов, определенных вашим исполняемым файлом. Тебе следует увидеть main указан как есть.

Например, на моей коробке Linux, int main(void) { } в противном случае пустой файл .cpp приводит к следующему выводу из nm:

$ nm main.o
U __gxx_personality_v0
0000000000000000 T main

Если я заверну main в пространстве имен (в этом случае namespace fred), Я получаю искаженное имя, как это:

$ nm main.o
0000000000000000 T _ZN4fred4mainEv
U __gxx_personality_v0

Обратите внимание на лишнюю тряпку вокруг названия main, Вы не должны видеть такого гобелена в своем nm выход.

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]