- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在项目中链接 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/
我是一名优秀的程序员,十分优秀!