gpt4 book ai didi

c - 为什么使用 libgcc.a 中的 sqrtf 函数会导致链接 double 函数?

转载 作者:行者123 更新时间:2023-11-30 19:51:20 30 4
gpt4 key购买 nike

我在项目中链接 libgcc.a 时遇到问题。我需要使用 sqrtf 和 log10f,因此我通过添加链接器标志“-lm”在 makefile 中添加了 libgcc.a,将 math.h 包含在模块中,一切都编译得很好,但我认为出了问题。当我更深入地研究mapfile时,简单地使用sqrtf会导致链接也用于 double 浮点处理,例如:

__aeabi_dadd、__aeabi_d2f、__aeabi_ddiv

还有更多。我真的不知道为什么 sqrtf 或 log10f 的单精度实现,特别是当 FPU 打开时,链接 double 函数。我研究了反汇编,但没有在我的代码中找到此函数的用途。仅在图书馆中我发现了事件。

我的工具链是:arm-none-eabi version 6-2017-q2内核:Cortex-M4F,链接器中启用的 FPU 硬件

有谁知道为什么会发生这样的事情吗?在这种情况下,代码大小对我来说非常重要。感谢您提前提供帮助。

最佳答案

使用 gcc 多目标 - 对我来说最著名的 gcc 工具链可以做到这一点。您需要为编译器和链接器指定正确的命令行选项

stm32f303示例

arm-none-eabi-gcc  -fno-math-errno -mcpu=cortex-m4 -mthumb -mfloat-abi=hard  -fsingle-precision-constant -mfpu=fpv4-sp-d16  -specs=nosys.specs -specs=nano.specs 

-fno-math-errno - 不执行检查,未设置 errno,sqrtf 被编译为单个 fpu 指令-fsingle- precision-constant - 当我主要使用 float 时,我更喜欢此选项,而不是在 float 常量的末尾写入 f 。-mfpu=fpv4-sp-d16 你的 FPU(实际上是我的 F303)

我认为其余的都是显而易见的。工具链应附带许多 fpu 和内核的库,链接器将选择正确的库。这是一种懒惰但有效的方法。

float f;
...
printf("%f", sqrtf(f));

编译为

 80028fa:   eddd 7a05   vldr    s15, [sp, #20]
80028fe: eeb1 7ae7 vsqrt.f32 s14, s15

如果您想从(几乎有时)最新的 gcc 版本中受益,请访问我 friend 的网站并构建/下载他的工具链 http://www.freddiechopin.info/en/articles/34-news/98-rewolucja-w-bleeding-edge-toolchain

关于c - 为什么使用 libgcc.a 中的 sqrtf 函数会导致链接 double 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46160704/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com