【问题标题】:GCC: include math.h function in bare-metal software on ARM (arm-none-eabi-gcc)GCC:在 ARM 上的裸机软件中包含 math.h 函数(arm-none-eabi-gcc)
【发布时间】:2021-09-13 09:35:52
【问题描述】:

我正在开发 STM32H753 上的裸机独立式软件。我既没有使用 libc 也没有使用 crt。

这里是链接命令行:

arm-none-eabi-gcc -T"xxx.ld" -mfpu=fpv5-d16 -mfloat-abi=hard -mthumb -ffreestanding -nostdlib -nostartfiles --specs=nosys.specs -Wl,--start-group -lc -lm -Wl,--end-group -Wl,-Map=xxx.map -o xxx.elf <list of .o>

现在我需要包含数学库,因为我使用的是sqrt 函数。我认为链接命令行就足够了,但我收到“sqrt undefined”错误。

我尝试添加libm.a的路径:(也尝试不使用-Wl

arm-none-eabi-gcc -T"xxx.ld" -Wl,-L/opt/gcc-arm-none-eabi-10-2020-q4-major/arm-none-eabi/lib/ -mfpu=fpv5-d16 -mfloat-abi=hard -mthumb -ffreestanding -nostdlib -nostartfiles --specs=nosys.specs -Wl,--start-group -lc -lm -Wl,--end-group -Wl,-Map=build_uP1/base_gen_uP1.map -o build_uP1/base_gen_uP1.elf <list of .o> 但我仍然遇到同样的错误。

我不明白要选择哪些选项来链接正确的库

【问题讨论】:

  • 您没有使用 libc,您使用的是 sqrt,并且您没有提供自己的 sqrt。你不能同时拥有这三个。
  • sqrt 是由 libm.a 实现的不是吗?
  • libm.a: (also tried without -Wl) 将链接移到对象之后。 gcc <options> <list of .o> -lm
  • 抱歉没有仔细阅读问题。 libm.a 是 glibc 的一部分,但您可以(有时)单独使用它。

标签: gcc arm stm32h7


【解决方案1】:

很抱歉这个自我回答,但我想我已经找到了解决方案。

  • 我的第一个错误是库必须放在命令行的末尾。参数的顺序很重要。
  • 那么在 gcc 安装中有很多版本的 libm.a 所以我必须选择正确的一个

以下行正在运行:

arm-none-eabi-gcc -T"xxx.ld" -L/opt/gcc-arm-none-eabi-10-2020-q4-major/arm-none-eabi/lib/thumb/v7+fp/hard/ -mfpu=fpv5-d16 -mfloat-abi=hard -mthumb -ffreestanding -nostdlib -nostartfiles --specs=nosys.specs -Wl,-Map=xxx.map -o xxx.elf <list of .o> -lm -lc

我注意到需要libc.a 中的一个符号和一些数据:__errnoimpure_data

【讨论】:

  • 是的,你需要告诉链接器库在哪里
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
  • 2022-10-19
  • 2020-07-16
  • 2018-04-08
  • 2015-08-08
相关资源
最近更新 更多