微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

交叉编译 Rust 的 SerialPort crate

如何解决交叉编译 Rust 的 SerialPort crate

我正在 Ubuntu 20.04.2 LTS 64 位上开发我的 Rust 项目。我已将项目设置为针对主机架构进行编译(使用 cargo build)并针对 ARM 64 位的目标架构进行交叉编译(使用 cargo build --target=aarch64-unkNown-linux-gnu)。到目前为止,该项目一直在交叉编译。在目标硬件平台上有应用程序将与之交互的串行端口,因此我已将 Serial Port 板条箱添加到我的项目中。该项目对于 Ubuntu 主机架构仍然可以很好地编译,但我无法再让它为 aarch64 目标进行交叉编译。

我已将目标添加到 rustup:

$ rustup target list
...
aarch64-fuchsia
aarch64-linux-android
aarch64-pc-windows-msvc
aarch64-unkNown-linux-gnu (installed)
aarch64-unkNown-linux-musl
aarch64-unkNown-none
aarch64-unkNown-none-softfloat
...

我已经安装了工具链来生锈:

$ rustup toolchain list
stable-aarch64-unkNown-linux-gnu
stable-x86_64-unkNown-linux-gnu (default)

当我运行 cargo build --target=aarch64-unkNown-linux-gnu 的货物构建命令时,我在编译期间收到以下错误

$ cargo build --target=aarch64-unkNown-linux-gnu
   Compiling libudev-sys v0.1.4
error: Failed to run custom build command for `libudev-sys v0.1.4`

Caused by:
  process didn't exit successfully: `/mnt/hgfs/trunk/src/application/target/debug/build/libudev-sys-c6234f1891f55461/build-script-build` (exit code: 101)
  --- stdout
  cargo:rerun-if-env-changed=LIBUDEV_NO_PKG_CONfig
  cargo:rerun-if-env-changed=PKG_CONfig_ALLOW_CROSS_aarch64-unkNown-linux-gnu
  cargo:rerun-if-env-changed=PKG_CONfig_ALLOW_CROSS_aarch64_unkNown_linux_gnu
  cargo:rerun-if-env-changed=TARGET_PKG_CONfig_ALLOW_CROSS
  cargo:rerun-if-env-changed=PKG_CONfig_ALLOW_CROSS
  cargo:rerun-if-env-changed=PKG_CONfig_aarch64-unkNown-linux-gnu
  cargo:rerun-if-env-changed=PKG_CONfig_aarch64_unkNown_linux_gnu
  cargo:rerun-if-env-changed=TARGET_PKG_CONfig
  cargo:rerun-if-env-changed=PKG_CONfig
  cargo:rerun-if-env-changed=PKG_CONfig_SYSROOT_DIR_aarch64-unkNown-linux-gnu
  cargo:rerun-if-env-changed=PKG_CONfig_SYSROOT_DIR_aarch64_unkNown_linux_gnu
  cargo:rerun-if-env-changed=TARGET_PKG_CONfig_SYSROOT_DIR
  cargo:rerun-if-env-changed=PKG_CONfig_SYSROOT_DIR

  --- stderr
  thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: "pkg-config has not been configured to support cross-compilation.\n\n                Install a sysroot for the target platform and configure it via\n                PKG_CONfig_SYSROOT_DIR and PKG_CONfig_PATH,or install a\n                cross-compiling wrapper for pkg-config and set it via\n                PKG_CONfig environment variable."',/home/nocker/.cargo/registry/src/github.com-1ecc6299db9ec823/libudev-sys-0.1.4/build.rs:38:41
  note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
warning: build Failed,waiting for other jobs to finish...
error: build Failed

我已经安装了 pkg-configlibudev-dev。从终端我可以得到这个输出以确认 pkg-config 已安装:

$ pkg-config --version
0.29.1

但是当我尝试检查 libudev 是否​​已安装时,我收到错误响应:

$ libudev
libudev: command not found
$ libudev-dev
libudev-dev: command not found

当我再次尝试安装 libudev 时,我得到:

$ sudo apt install libudev-dev
Reading package lists... Done
Building dependency tree       
Reading state information... Done
libudev-dev is already the newest version (245.4-4ubuntu3.4).
0 upgraded,0 newly installed,0 to remove and 15 not upgraded.

当我尝试安装 libudev-sys 时,我得到:

$ sudo apt install libudev-sys
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package libudev-sys

我怀疑我无法交叉编译的原因是因为 libudev 但无法弄清楚这一点。几天来,我一直在尝试研究如何解决这个问题,但没有找到解决方案。任何帮助或指导将不胜感激。 TIA。

解决方法

如果您不依赖某些额外功能,您可以禁用默认的 libudev 功能。以这种方式调整 Cargo.toml:

serialport = {version = "4.0.1",default-features = false}

另请参阅此处的说明:https://crates.io/crates/serialport

否则您必须安装 sysroot 或包装器。但我无法弄清楚如何做到这一点(上面的解决方案对我来说很好用)。我得到的错误信息更有意义:

pkg-config has not been configured to support cross-compilation.
Install a sysroot for the target platform and configure it via
PKG_CONFIG_SYSROOT_DIR and PKG_CONFIG_PATH,or install a
cross-compiling wrapper for pkg-config and set it via PKG_CONFIG
environment variable.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。