我正在为 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 上进行交叉编译,并且正在运行裸机。
有人对此有任何了解或以前见过此错误吗?我唯一看到 LoopFillZerobss 的地方 函数在电路板的程序集启动文件中。
最佳答案
要检查的事情:
- 确保正确声明
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
并且没有意外地将其放入命名空间。排序后,初始化例程 LoopFillZerobss
应该会更快乐。
关于c++ - LoopFillZerobss 具有对 main 的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18137814/