簡體   English   中英

Rust中使用C FFI的代碼如何與標頭保持同步?

[英]How can code that uses C FFI in Rust keep in sync with headers?

對於使用FFI包裝C代碼的代碼(通常是包裝箱),如何使Rust定義和C標頭保持同步? 還是確保它們與之匹配?

是否有用於處理此問題的工具,還是每個開發人員都有責任手動檢查此問題?

更新:使其更加具體。 有沒有辦法知道何時:

  • 結構的成員更改其類型。
  • 函數參數更改其類型。

這樣,與Rust代碼的任何不匹配都會警告或無法完全編譯嗎?


我在板條箱中遇到了崩潰,我懷疑這是由API不匹配引起的,至今仍報告但未解決。

解決方案1:結合蛋白

結合bindgen! 模塊獲取一個C頭文件,並在編譯時生成Rust綁定。 bindgen文檔中的示例:

#![feature(plugin)]
#![plugin(bindgen)]

mod lua_bindings {
    bindgen!("/usr/include/lua.h", link="lua", builtins=true)
}

它增加了clang作為代碼的復雜性,並且每晚都依賴於rust。 不幸的是,這使您的項目繁重(從依賴角度而言)並且每晚都會生銹,但是它可以幫助您的FFI綁定保持最新狀態,並且跨體系結構問題可以歸結為了解每種體系結構的頭文件在哪里。

以我的經驗,bindgen可以很好地工作,它有一些局限性,因此並非在所有情況下都適用。

解決方案2:ctest

Libc采取了另一種方法。 Libc對於當前支持的18種體系結構,基本上由FFI綁定組成,因此對FFI綁定的正確性有很高的要求。

在Libc中,綁定是手動完成的(通常是在命令行運行bindgen的幫助下),然后使用https://github.com/alexcrichton/ctest針對頭文件進行測試

它的工作方式是指定要檢查的所有C標頭,然后庫將其與您在代碼中指定的extern fn定義進行比較並確保。

所有函數簽名,常量值,結構布局/對齊方式,類型大小/對齊方式等都與它們的C等效項匹配(引自docs

將travis投入使用,您可以確保FFI綁定對於所有支持的體系結構上的每個代碼更改都是正確的(查看libc的pull請求 ,其中每個pull自動通過travis運行,並允許作者在PR之前糾正所有錯誤。合並)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM