LoopF​​illZerobss有一个未定义的main引用

时间:2013-08-08 23:18:09

标签: c++ linker main bare-metal stm32f4discovery

我正在为STM32F4微控制器编译c ++应用程序。 我的所有代码都成功编译,但链接步骤失败了 以下错误:

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

我熟悉未定义引用主要错误的典型原因, 也就是说,尝试编译一个没有主要存在的应用程序。 但是,我确实有一个main.cpp,当然还有一个main函数。 它编译为main.o,并与创建的其他目标文件链接 在编译期间。

我正在交叉编译到STM32F407上,我正在运行裸机。

有人对此有任何见解或之前看过这个错误吗?我唯一看到LoopF​​illZerobss的地方 函数位于电路板的汇编启动文件中。

1 个答案:

答案 0 :(得分:1)

要检查的事项:

  • 确保正确声明main。例如,int main(void)int main(int argc, char **argv),而非void main(void)。这篇Stack Overflow文章做得很好:What is the proper declaration of main?
  • 确保您没有意外地将main包裹在namespace
  • 如果你有一个异常古怪的C ++编译器,可能需要将main标记为extern "C",但说实话,我从未见过需要的工具这一点。

您应该能够通过在main.o上运行nm等工具来查看nm定义的符号。 (至少,UNIX风格的工具链,例如GNU工具链,提供nm工具。)main将列出可执行文件定义的符号集。您应该看到int main(void) { }按原样列出。

例如,在我的Linux机器上,$ nm main.o U __gxx_personality_v0 0000000000000000 T main 在一个空的.cpp文件中导致以下来自nm的输出:

main

如果我将namespace fred包装在命名空间中(在本例中为$ nm main.o 0000000000000000 T _ZN4fred4mainEv U __gxx_personality_v0 ),我会得到一个像这样的错位名称:

main

注意名称nm周围的额外gobbledegook。你不应该在main输出中看到这样的gobbledegook。

您应该能够看到您是否正确声明LoopFillZerobss并且不小心将其放入命名空间。一旦你对它进行了排序,那么初始化例程{{1}}应该会更加快乐。