LoopFillZerobss对main有一个未定义的引用

LoopFillZerobss has an undefined reference to main

本文关键字:引用 未定义 有一个 main LoopFillZerobss      更新时间:2023-10-16

我正在为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应该会更快乐。