c++ - LoopF​​illZerobss 具有对 main 的 undefined reference

标签 c++ linker program-entry-point bare-metal stm32f4discovery

我正在为 STM32F4 微 Controller 编译一个 C++ 应用程序。 我的所有代码都编译成功,但链接步骤失败并出现 以下错误:

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

我熟悉 undefined reference to main 错误的典型原因, 也就是说,尝试编译一个根本没有 main 的应用程序。 但是,我确实有一个 main.cpp,自然地,其中有一个 main 函数。 它编译为 main.o 并与创建的其他目标文件链接 在编译期间。

我正在 STM32F407 上进行交叉编译,并且正在运行裸机。

有人对此有任何了解或以前见过此错误吗?我唯一看到 LoopF​​illZerobss 的地方 函数在电路板的程序集启动文件中。

最佳答案

要检查的事情:

  • 确保正确声明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",但老实说,我从未见过需要它的工具。

您应该能够通过在其上运行诸如 nm 之类的工具来查看您的 main.o 定义了哪些符号。 (至少,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 并且没有意外地将其放入命名空间。排序后,初始化例程 LoopF​​illZerobss 应该会更快乐。

关于c++ - LoopF​​illZerobss 具有对 main 的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18137814/

相关文章:

c - 将 "too many"参数传递给外部函数是否安全?

ios - 在两个依赖框架中链接静态库时重新定义模块

java - 我正在尝试重载主要方法,但在 cmd 中出现以下错误

c++ - C++重载运算符<用于结构:错误的参数太多

c++ - C++ 变量模板是内联的吗?

c++ - C++ 中多个文件的声明/初始化问题

c++ - 需要引用标准关于 main 函数作为模板函数的合法性

c++ - 函数模板中的 is_const<func-param> 总是返回 false

c++ - 从文件中流式传输数字

C 我不能打印一个整数,它在命令行中作为参数传递