这是针对android ndk项目的,但我猜它一般适用于arm的gcc。
我知道android ndk使用soft float来保持与armv5的兼容性,但我突然想到,在为我们的项目编译armv7库时,库内部的所有调用都可以使用hard float,而对其他库的调用只能使用soft float,但我不确定是否可以告诉编译器这样做。我的感觉是不是,但我希望有人知道怎么做。
(顺便说一下,如果在ndk中clang可以这样做,或者clang就是这样做的,那么很高兴知道)
一些背景知识:这是一个基于物理的库,使用ndk编译,所以大量使用浮点,我正在寻找可能的优化。
编辑:考虑一下,它只能确定一个函数在链接时是否是外部的,而硬/软浮点会影响编译器,所以我猜如果可能的话,我需要手动指定应该使用硬浮点的函数,以便编译器知道。
最佳答案
更新:ndk r9b添加了对使用-mhard float构建库的支持。参见the NDK page。
(以下是原始答案。)
做这件事不容易。编译器需要知道每个方法要使用什么调用约定,并且没有“软fp”属性。您可以编写(或生成)在调用约定之间转换的包装器函数,但这很尴尬,也很烦人。
如果您有一个使用float的库,但没有任何函数将float作为参数,并且没有调用接受float的外部函数(例如libc实用程序函数)——本质上是一个黑匣子,外部查看器根本看不到它使用float——那么您应该能够用“硬fp”构建。