我正在为STM32F4微控制器编译一个c ++应用程序。我的所有代码都已成功编译,但链接步骤失败,并显示以下错误:
/tmp/ccGj7Wge.o: In function `LoopFillZerobss':
(.text.Reset_Handler+0x32): undefined reference to `main'
collect2: error: ld returned 1 exit status
我熟悉未定义引用主要错误的典型原因,也就是说,尝试在没有主节点的情况下编译应用程序。但是,我确实有一个主要功能.cpp,当然,其中有一个主要功能。它编译到 main.o,并与创建的其他目标文件链接在编译期间。
我正在交叉编译到STM32F407并且我正在运行裸机。
有人对此有任何见解或以前见过此错误吗?我唯一看到LoopFillZerobss的地方函数位于电路板的程序集启动文件中。
要检查的事项:
- 确保正确声明
main
。 例如,int main(void)
或int main(int argc, char **argv)
,而不是void main(void)
。 这篇 Stack Overflow 文章做得很好:什么是 main 的正确声明? - 确保您没有意外地将
main
包裹在namespace
中。 - 如果你有一个非常古怪的C++编译器,你可能需要
main
标记为extern "C"
,但说实话,我从未见过需要它的工具。
您应该能够通过在其上运行nm
等工具来查看您的main.o
定义了哪些符号。 (至少,UNIX风格的工具链,如GNU工具链,提供了一个nm
工具。 nm
将列出可执行文件定义的符号集。 您应该会看到按原样列出的main
。
例如,在我的 Linux 盒子上,在其他空.cpp文件中int main(void) { }
会导致以下来自 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
应该会更快乐。