1

我正在为 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 函数的唯一地方是电路板的程序集启动文件。

4

1 回答 1

2

检查事项:

  • 确保您声明main正确。例如,int main(void)int main(int argc, char **argv),而不是void main(void)。这篇 Stack Overflow 文章做得很好: main 的正确声明是什么?
  • 确保您没有意外包裹mainnamespace.
  • 如果您有一个非常古怪的 C++ 编译器,您可能需要标记mainextern "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

请注意 name 周围的额外 gobbledegook main。您不应该在nm输出中看到这样的 gobbledegook。

您应该能够查看您是否正确声明main,而不是意外将其放入命名空间。一旦你得到了排序,那么初始化例程LoopFillZerobss应该会更快乐。

于 2013-08-09T05:59:54.663 回答