Я компилирую приложение 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
Функция находится в файле запуска сборки для платы.
Вещи, чтобы проверить:
main
правильно. Например, int main(void)
или же int main(int argc, char **argv)
, и не void main(void)
, Эта статья переполнения стека делает большую работу: Что такое правильное объявление основного?main
в namespace
,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
должно быть намного счастливее.
Других решений пока нет …