C 什么';硬浮点数和软浮点数的区别是什么?
当我用交叉工具链编译C代码时,链接器打印出警告页面,说我的可执行文件使用硬浮动,而我的libc使用软浮动。区别是什么?听起来您的libc是为软件浮点操作而构建的,而您的exe是在假设硬件支持浮点的情况下编译的。在短期内,您可以强制软浮动作为编译器标志。(如果您使用的是gcc,我认为它是-msoft float)C 什么';硬浮点数和软浮点数的区别是什么?,c,linux,floating-point,arm,libc,C,Linux,Floating Point,Arm,Libc,当我用交叉工具链编译C代码时,链接器打印出警告页面,说我的可执行文件使用硬浮动,而我的libc使用软浮动。区别是什么?听起来您的libc是为软件浮点操作而构建的,而您的exe是在假设硬件支持浮点的情况下编译的。在短期内,您可以强制软浮动作为编译器标志。(如果您使用的是gcc,我认为它是-msoft float) 从长远来看,如果您的目标处理器具有浮点操作的硬件支持,您通常会希望构建或找到一个跨工具链,并启用硬件浮点以提高速度。有些处理器系列有型号变体,有些有硬件支持,有些没有硬件支持。因此,举例
从长远来看,如果您的目标处理器具有浮点操作的硬件支持,您通常会希望构建或找到一个跨工具链,并启用硬件浮点以提高速度。有些处理器系列有型号变体,有些有硬件支持,有些没有硬件支持。因此,举例来说,仅仅说你的处理器是ARM不足以知道你是否有硬件浮点支持。硬浮点使用片上浮点单元。软浮动模拟软件中的浮动。区别在于速度。奇怪的是,在同一个目标体系结构上使用这两种芯片,因为该芯片要么有FPU,要么没有FPU。可以使用-msoft float在GCC中启用软浮点。如果使用硬件浮点运算,您可能需要重新编译libc以使用硬件浮点运算。有三种方法进行浮点运算:
- 如果您的CPU有FPU,请使用浮点指令。(快速)
- 让编译器将浮点运算转换为整数运算。(慢)
- 使用浮点指令和不带FPU的CPU。CPU将生成异常(保留指令、未实现指令或类似指令),如果操作系统内核包含浮点仿真器,它将模拟这些指令(速度最慢)
在一些控制器系列中,例如ARM,浮点硬件存在于该系列的某些型号中,但不存在于其他型号中,因此这些系列的gcc支持两者。你的问题似乎是你混淆了这两个选项。严格地说,所有这些答案在我看来都是错误的 当我用交叉工具链编译C代码时,链接器打印出警告页面,说我的可执行文件使用硬浮动,而我的libc使用软浮动。有什么区别 Debian有关于
-mfloat abi
的三个选项的信息
-这是纯软件soft
-这支持硬件FPU,但ABI是软兼容的softfp
-ABI使用浮点或VFP寄存器hard
-mfpu=vfp
等编译代码,但您应该使用-mfloat abi=softfp
,这样,如果libc需要浮点,它将以库理解的方式传递
Linux内核可以支持VFP指令的仿真。显然,对于这种情况,最好使用-mfpu=none
进行编译,并让编译直接生成代码,而不是依赖于任何Linux内核仿真。然而,我不相信OP的错误实际上与这个问题有关。它是单独的,也必须与-mfloat abi
一起处理
与此相反;libc是硬浮动的,但应用程序只是软浮动的。它有一些解决问题的方法,但是使用正确的选项重新编译总是最容易的
另一个问题是Linux内核必须支持VFP任务(或任何ARM浮点)来保存/恢复上下文开关上的寄存器。如果是ARM体系结构,请将其放入标记:-)@Nils Pipenbrinck:MIPS芯片也有此问题Modern GCC(~4.8+)版本支持“多库”,其中包含硬浮点和软浮点库。早期版本要求使用特定版本构建编译器。当链接到“多库”gcc发行版时,有时需要正确库的路径,因为有多个版本的库(构建编译器需要更长的时间)。目录名可能是“hf”、“hardf”、“libhf”或“hard float”,但它们通常位于常规的“soft”目录下或附近的位置。这是正确的答案。浮点数的调用转换需要在代码和libc之间匹配。如果您从未调用过任何浮点libc函数,它可能仍然适用于不匹配的情况。“在相同的目标体系结构上看到两者都使用是很奇怪的”这对于一个库来说是有意义的,它在精度关键的部分是机器独立的、位精确的(软浮点)和快速的(硬浮点)在小偏差无关紧要的部分,它发生在32位ARM上。