簡體   English   中英

從 Rust 調用 C 庫給出“LINK:致命錯誤 LNK1181:無法打開輸入文件”

[英]Calling C library from Rust gives "LINK : fatal error LNK1181: cannot open input file"

我正在嘗試從 Rust 調用 STM32 Cube Programmer C 庫。

完整代碼和顯示各種嘗試的分支可在此處獲得: https://github.com/becky112358/rust_c_linking_stm32_cube_programmer

嘗試 1(在我的 GitHub 存儲庫中,分支main

按照 Rust Bindgen 教程: https://rust-lang.github.io/rust-bindgen/

這是我的首選方法。 一個 Rust 箱子包裝了 C 庫。 其他 Rust crate 可以包含 Rust wrapper crate,而不必擔心任何 C 庫。

... 理論上。

包裝 C 庫 ( libstm32_cube_programmer_sys ) 的 Rust 板條箱構建正常。 它的測試運行正常。 調用包裝 C 庫( caller )的 Rust 包裝箱的 Rust 包裝箱未構建,但報告:

    = note: LINK : fatal error LNK1181: cannot open input file '.\drivers\CubeProgrammer_API.lib'

為什么caller還要嘗試查找 C 庫? 我希望libstm32_cube_programmer_sys能夠處理所有 C 庫到 Rust 的轉換,並且任何 Rust 板條箱然后調用libstm32_cube_programmer_sys可能是純粹的 Rusty(可能有些不安全)。

  • build.rs我最初錯誤地寫了 C 庫名稱,並且libstm32_cube_programmer_sys沒有構建。 更正庫名稱允許libstm32_cube_programmer_sys成功構建。 所以看起來libstm32_cube_programmer_sys確實打開了 C 庫。
  • 我嘗試將drivers文件夾的路徑添加到我的PATH
  • 我嘗試列出 C 庫的絕對路徑:
println!("cargo:rustc-link-lib=C:/[blah blah]/drivers/CubeProgrammer_API");

如果沒有 Rust 報告,我找不到如何正確輸入路徑:

    error: renaming of the library `C` was specified, however this crate contains no `#[link(...)]` attributes referencing this library.



嘗試 2(分支all_in_one

main分支中,問題似乎可能是libstm32_cube_programmer_sys可以找到 C 庫,但caller找不到。 所以我嘗試丟棄單獨的 Rust 包裝箱,並使用一個 Rust 包裝箱,它包裝了 C 庫並調用了 C 函數。

這次我得到以下錯誤,加上一個額外的警告:

    = note: caller.59pofysds2mkvvjr.rcgu.o : error LNK2019: unresolved external symbol disconnect referenced in function _ZN6caller4main17ha79648c0a9e86ed0E
    .\drivers\CubeProgrammer_API.lib : warning LNK4272: library machine type 'x86' conflicts with target machine type 'x64'



嘗試 3(分支link_search

我在 inte.net 上搜索了很多,發現有很多不同的方法可以從 Rust 調用 C 庫。一種方法是使用link-search而不是link-lib 這肯定只會讓編譯器更難,因為你讓它做更多的工作。 但是我被卡住了,需要嘗試不同的東西!

這次我得到以下錯誤,加上獎金警告:

    = note: caller.59pofysds2mkvvjr.rcgu.o : error LNK2019: unresolved external symbol __imp_disconnect referenced in function _ZN6caller4main17ha79648c0a9e86ed0E
    .\drivers\CubeProgrammer_API.lib : warning LNK4272: library machine type 'x86' conflicts with target machine type 'x64'



問題

我如何使這項工作? 最好從Attempt 1開始,但我會接受任何東西!

當我們有:

C 圖書館 <- Rust 圖書館 <- Rust 代碼

看起來

  • 編譯時,Rust 代碼需要能夠看到 C 庫,即使它也在調用 Rust 庫
  • 運行時,可能需要將 C dll 與 Rust exe 一起存儲

這是我發布原始問題時的主要誤解。

其他一些提示/提醒:

  • 確保使用正確的 lib 文件(x64、x86 等)
  • 也解決警告!

暫無
暫無

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

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