1

我正在尝试使用 CodeBench G++ Lite 工具为 STM32 芯片编译一些代码。但是,它会产生错误。

    startup.o: In function `LoopFillZerobss':
(.text.Reset_Handler+0x2a): undefined reference to `__libc_init_array'

我用谷歌搜索,似乎 libc_init_array 可能是一些标准 gcc 库的一部分......但我不知道如何解决这个错误?

我也有这样的错误

arm-none-eabi-ld: cannot find libc.a

同样对于 libgcc.a 和 libm.a

4

1 回答 1

2

该函数__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 的员工,除了购买了他们的一些产品,并尝试在他们的论坛上回答问题外,与该公司没有任何关系。

于 2012-03-16T21:21:37.077 回答