草庐IT

c++ - Raspberry Pi ARM Float ABI 兼容性

coder 2024-02-17 原文

我目前正在我的 Ubuntu 机器上对 Raspberry Pi 执行一些交叉编译测试。我目前的理解是 Raspberry Pi 支持硬件浮点,默认的 Raspbian OS 镜像是使用硬件浮点 (armhf) 构建的。正确吗?

如果我使用“arm-linux-gnueabi”工具链(未指定任何 ARM 标志)构建我的应用程序,那么我的应用程序将使用软浮点 ABI。正确吗?

在这种情况下,我的所有依赖项也必须使用相同的 ABI 才能正确链接。正确吗?

如果我的应用程序使用软浮点 ABI,那么我的应用程序肯定链接到软浮点 ABI 共享标准库。当我在我的 Raspberry Pi 上运行我的应用程序时,一切都按预期工作。如果 Raspbian 使用硬浮点 ABI(我猜共享标准库也这样做),这怎么可能?

仅供引用:我的默认 arm-linux-gnueabi 配置为:

--with-float=soft
--with-arch=armv5

我正在这样编译我的应用程序:

arm-linux-gnueabi-g++ test.cpp -o test

我的程序确实包含浮点计算:

double test = (123.456 + 789.123) * 1.23;
printf("%f\n", test); // prints: 1122.472170
printf("%f\n", std::floor(test)); // prints: 1122.000000

最佳答案

你所有的肯定都是正确的,我只是想增加一点关于 Raspbian 的 armhf 的精确度。

Debian 的 armhf (arm-linux-gnueabihf) 以 ARMv7t hard-float 为目标。由于 Raspbian 是基于 Debian 的,因此您会期望相同,但 Raspbian 的 armhf 目标是 ARMv6 hard-float(这正是 Raspbian 存在的首要原因: 在 Debian 的 armel -- ARMv4t soft-float -- 和 armhf 架构之间找到一个中间地带,以正确利用 Raspberry 的 CPU)。

所以 Raspbian 说 armhf 有点背信弃义,特别是因为许多人会使用 Debian(或 Ubuntu 等衍生产品)作为主机系统,因此很可能混淆两者.如果你问我,Raspbian 的人犯了一个错误,保持相同的架构名称,它真的应该是 arm6hf

When I run my application on my Raspberry Pi everything works as expected. How can this be, if Raspbian uses hard float ABI (and I'm guessing the shared standard library also does)?

据我所知,arm-linux-gnueabiarm-linux-gnueabihf 之间的唯一区别是涉及 float 的调用约定(前者通过它们使用整数寄存器,后者使用浮点寄存器)。

如果您从未在测试程序中使用浮点 ABI(我的意思是您不通过 CPU/FPU 寄存器将 float 传递给外部库——但是您可以在内部完美地进行浮点计算—— - 使用 soft-float——例如在第三方库中实际“使用”它之前将结果转换为 int),那么你永远不会遇到 ABI 差异并且所有工作。

关于您给出的使用 float 的示例,我相信它们属于我刚才描述的类别:您从不使用 hard-float ABI。

  • 很可能 std::floor 是内联的(确保这一点的最佳方法是查看您的程序集转储)。
  • printf 使用可变参数,因此您实际上使用的是遗留的 C 调用约定,即。参数在堆栈上传递,而不是通过 CPU/FPU 寄存器传递。

无论如何,您应该避开当前的 arm-linux-gnueabi 工具链,并使用专为 Raspbian 设计的工具链。只需在网络上搜索“Raspberry Pi 交叉编译器”即可。这样你就不会被打扰。

关于c++ - Raspberry Pi ARM Float ABI 兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19180351/

有关c++ - Raspberry Pi ARM Float ABI 兼容性的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  3. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  4. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  5. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  6. += 的 Ruby 方法 - 2

    有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=

  7. ruby-on-rails - 不兼容的库版本 : nokogiri. bundle 需要 8.0.0 或更高版本,但 libiconv.2.dylib 提供 7.0.0 版本 - 2

    为了在我的mac上为一个rails项目安装mysql,我遵循了安装Homebrew软件和删除mac端口的在线建议。这是问题开始的地方。rails项目不会构建,我得到这个:[rake--prereqs]rakeaborted!dlopen(/Users/Parker/.rvm/gems/ruby-1.9.3-p448/gems/nokogiri-1.6.0/lib/nokogiri/nokogiri.bundle,9):Librarynotloaded:/opt/local/lib/libiconv.2.dylibReferencedfrom:/Users/Parker/.rvm/gem

  8. ruby - Sinatra + Heroku + Datamapper 使用 dm-sqlite-adapter 部署问题 - 2

    出于某种原因,heroku尝试要求dm-sqlite-adapter,即使它应该在这里使用Postgres。请注意,这发生在我打开任何URL时-而不是在gitpush本身期间。我构建了一个默认的Facebook应用程序。gem文件:source:gemcuttergem"foreman"gem"sinatra"gem"mogli"gem"json"gem"httparty"gem"thin"gem"data_mapper"gem"heroku"group:productiondogem"pg"gem"dm-postgres-adapter"endgroup:development,:t

  9. ruby - Ruby 中字符串运算符 + 和 << 的区别 - 2

    我是Ruby和这个网站的新手。下面两个函数是不同的,一个在函数外修改变量,一个不修改。defm1(x)x我想确保我理解正确-当调用m1时,对str的引用被复制并传递给将其视为x的函数。运算符当调用m2时,对str的引用被复制并传递给将其视为x的函数。运算符+创建一个新字符串,赋值x=x+"4"只是将x重定向到新字符串,而原始str变量保持不变。对吧?谢谢 最佳答案 String#+::str+other_str→new_strConcatenation—ReturnsanewStringcontainingother_strconc

  10. ruby - rails 3.2.2(或 3.2.1)+ Postgresql 9.1.3 + Ubuntu 11.10 连接错误 - 2

    我正在使用PostgreSQL9.1.3(x86_64-pc-linux-gnu上的PostgreSQL9.1.3,由gcc-4.6.real(Ubuntu/Linaro4.6.1-9ubuntu3)4.6.1,64位编译)和在ubuntu11.10上运行3.2.2或3.2.1。现在,我可以使用以下命令连接PostgreSQLsupostgres输入密码我可以看到postgres=#我将以下详细信息放在我的config/database.yml中并执行“railsdb”,它工作正常。开发:adapter:postgresqlencoding:utf8reconnect:falsedat

随机推荐