一个如何与SoftFloat库链接?

时间:2018-09-16 18:23:35

标签: c

我正在设计硬件,以执行符合IEEE-754标准的浮点运算。 SoftFloat是一个库(由John Hauser-UC Berkeley编写)是IEEE-754浮点行为的参考模型(在C ++中)。它实现了执行标准指定的所有浮点计算的功能。我想使用SoftFloat为我的硬件实现生成测试用例。作者页面的链接为http://www.jhauser.us/arithmetic/SoftFloat.html

我从该页面上的链接(http://www.jhauser.us/arithmetic/SoftFloat-3e.zip)下载了zip文件,将其解压缩,并用来提供Makefile进行构建。我在Windows10上以bash运行。在构建过程结束时,我将获得一个存档文件“ softfloat.a”。

SoftFloat实现的功能之一是融合浮点乘加。根据文档,可以通过调用f32_mulAdd函数来调用它,并且它的模板在提供的头文件softfloat.h中。

在我的主代码(sf.cc)中,包括该标头,使用在同一标头中定义的类型定义该函数的参数,并使用以下代码构建代码:

gcc -o sf -I. sf.cc softfloat.a

这会出现以下错误:

/tmp/ccALxpC8.o: In function `main':
sf.cc:(.text+0x4f): undefined reference to `f32_mulAdd(float32_t, float32_t, float32_t)'
collect2: error: ld returned 1 exit status

f32_mulAdd IS是在softfloat.h中定义的(我已选中),并且归档文件softfloat.a中确实包含f32_mulAdd.o(已通过ar -t softfloat.a检查)和SoftFloat源代码中的f32_mulAdd.c来定义函数(如“ float32_t f32_mulAdd(float32_t a,float32_t b,float32_t c)”),并且我对该函数的调用与定义一致,所以我不明白为什么收到此消息。如果有人使用过SoftFloat,请发出提示音。

我在其中调用SoftFloat函数f32_mulAdd的源代码如下(我希望首先对其进行干净地编译/链接,然后再添加语句以初始化变量乘数,被乘数并加成特定值): / p>

#include "platform.h"
#include "internals.h"
#include "softfloat.h"
#include "softfloat_types.h"

int float_rounding_mode = 0;

int main()
{
    uint8_t rounding_mode;
    uint8_t exceptions;

    uint32_t multiplier, multiplicand, addend, result;
    float32_t f_multiplier, f_multiplicand, f_addend, f_result;

    f_multiplier.v = multiplier;
    f_multiplicand.v = multiplicand;
    f_addend.v = addend;

    softfloat_roundingMode = rounding_mode;
    softfloat_exceptionFlags = 0;
    softfloat_detectTininess = softfloat_tininess_beforeRounding;

    f_result = f32_mulAdd(f_multiplier, f_multiplicand, f_addend);

    result = f_result.v;    
    exceptions = softfloat_exceptionFlags & 0x1f;

    return 0;
}

2 个答案:

答案 0 :(得分:3)

生活和学习!关键是将头文件包含内容更改为:

extern "C" {
#include "softfloat.h"
}

Also, softfloat.h was the only header file required.

答案 1 :(得分:-2)

不需要使用softfloat库。

GCC编译器已经具有浮点实现。

例如-您可以对浮点类型执行A + B运算,您应该得到结果。 您也可以使用pipenv控制舍入模式,并使用获取异常。