我正在为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上,我正在运行裸机。
有人对此有任何见解或之前看过这个错误吗?我唯一看到LoopFillZerobss的地方 函数位于电路板的汇编启动文件中。
答案 0 :(得分:1)
要检查的事项:
main
。例如,int main(void)
或int main(int argc, char **argv)
,而非void main(void)
。这篇Stack Overflow文章做得很好:What is the proper declaration of main? main
包裹在namespace
。main
标记为extern "C"
,但说实话,我从未见过需要的工具这一点。您应该能够通过在main.o
上运行nm
等工具来查看nm
定义的符号。 (至少,UNIX风格的工具链,例如GNU工具链,提供nm
工具。)main
将列出可执行文件定义的符号集。您应该看到int main(void) { }
按原样列出。
例如,在我的Linux机器上,$ nm main.o
U __gxx_personality_v0
0000000000000000 T main
在一个空的.cpp文件中导致以下来自nm的输出:
main
如果我将namespace fred
包装在命名空间中(在本例中为$ nm main.o
0000000000000000 T _ZN4fred4mainEv
U __gxx_personality_v0
),我会得到一个像这样的错位名称:
main
注意名称nm
周围的额外gobbledegook。你不应该在main
输出中看到这样的gobbledegook。
您应该能够看到您是否正确声明LoopFillZerobss
并且不小心将其放入命名空间。一旦你对它进行了排序,那么初始化例程{{1}}应该会更加快乐。