繁体   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