2013-05-30 39 views
3

一些功能這是一個Android NDK的項目,但我猜它適用於GCC一般爲ARM。我知道Android NDK使用soft float來保持與ARMv5的兼容性,但是在我編譯我們項目的ARMv7庫時,庫內的所有調用都可以使用硬浮動,並且只能使用軟浮動對其他庫的調用,但我不確定是否可以告訴編譯器這樣做。我的感覺是,事實並非如此,但我希望有人可能知道一種辦法。硬浮動要求在GCC

(作爲一個方面說明 - 如果這是可能的鏘在NDK或者鏘只是這樣做,它會是很好的瞭解)

一些背景資料:這是正在與編譯基於物理的圖書館NDK在浮點的使用方面非常重要,我正在研究可能的優化。

編輯:思考它,它只能確定一個函數是否在鏈接時是外部的,而硬/軟浮動會影響編譯器,所以我猜如果這是可能的,我需要手動指定應該使用硬浮點數的函數,以便編譯器知道。

回答

3

更新: NDK r9b增加了對使用-mhard-float構建庫的支持。見the NDK page

(原來的答覆如下。)

有沒有簡單的方法來做到這一點。編譯器需要知道每個方法使用哪些調用約定,並且沒有「軟fp」屬性。您可以編寫(或生成)在調用約定之間進行轉換的包裝函數,但這很尷尬和煩人。

如果你有一個使用浮動,但不具有采取浮動作爲參數的任何功能,並且不叫喚到採取浮動外部功能(例如libc中的效用函數)庫 - 本質上是一個黑盒子這對外部用戶來說根本不會使用float - 那麼你應該可以用「hard fp」來構建。

+0

也正在考慮類似的第二段的自包含硬FP的東西 - 我能看到情況下,這將是值得的麻煩。 –

+0

謝謝 - 我想我們的案例中的主要問題可能是trig函數。希望我有機會嘗試儘快將我們的浮點代碼分離到單獨的庫中。在libm中 –

+0

觸發功能可以通過從仿生/ libm中源和構建自己的libm處理靜態鏈接到你的庫(所以它不會嘗試從libc的解決符號)。還有其他問題,例如如果庫使用float args接收回調函數。 – fadden