我正在尝试使用CodeBench G ++ Lite工具为STM32芯片编译一些代码。但是,它会产生错误。
startup.o: In function `LoopFillZerobss':
(.text.Reset_Handler+0x2a): undefined reference to `__libc_init_array'
我用Google搜索了,看来libc_init_array可能是某个标准gcc库的一部分......但我不确定如何修复此错误?
我也有这样的错误
arm-none-eabi-ld: cannot find libc.a
,类似于libgcc.a和libm.a
答案 0 :(得分:1)
函数__libc_init_array
是CodeSourcery的'启动'代码的'CS3'机制的一部分,它确保所有程序静态初始化在main
执行之前发生。
首先确保找到所有库。这可能足以解决您的所有问题。
一种方法是使用arm-none-eabi-g ++,而不是直接使用arm-none-eabi-ld进行链接,因为g ++应该正确地将一些重要参数传递给arm-none-eabi-ld。在某些情况下,这可能是查找和链接正确库所需的全部内容。
如果你不确定如何在命令行上构建,或者arm-none-eabi -g ++没有做任何事情来解决丢失的库,那么去看看LeafLabs网站,在那里他们展示如何使用Makefile从命令行构建 http://leaflabs.com/docs/unix-toolchain.html
他们为STM32提供免费的开源IDE,专为Windows,Linux和Mac而构建,其中包括适用于每个平台的基于gcc的工具链,以及足够的库来启动http://leaflabs.com/docs/maple-ide-install.html
即使您更喜欢使用工具链进行实际构建,也可能值得使用他们的Makefile,以便理智地检查您用于构建程序的过程。
我不是LeafLabs员工的成员,除了我买了他们的一些产品之外与公司没有任何关系,并尝试在他们的论坛上回答问题。