【问题标题】:Cross-compiling Rust's SerialPort crate交叉编译 Rust 的 SerialPort crate
【发布时间】:2021-02-19 05:39:40
【问题描述】:

我正在 Ubuntu 20.04.2 LTS 64 位上开发我的 Rust 项目。我已经设置项目来编译主机架构(使用cargo build)并交叉编译ARM 64位的目标架构(使用cargo build --target=aarch64-unknown-linux-gnu)。到目前为止,该项目一直在交叉编译。在目标硬件平台上有应用程序将与之交互的串行端口,因此我将Serial Port crate 添加到我的项目中。该项目对于 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 的工具链:

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

当我运行 cargo build --target=aarch64-unknown-linux-gnu 的 cargo build 命令时,在编译过程中出现以下错误:

$ 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。

【问题讨论】:

    标签: linux rust serial-port cross-compiling arm64


    【解决方案1】:

    如果您不依赖某些额外功能,您可以禁用默认的 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.
    

    【讨论】:

    • 谢谢,这是我需要的答案。在板条箱描述中说您可以执行“$ cargo build --no-default-features”,但这对我不起作用。将设置放入 Cargo.toml 文件是我所缺少的。对于刚接触 Rust 的人来说,很难找到如何应用该设置。
    猜你喜欢
    • 1970-01-01
    • 2016-10-28
    • 2017-02-03
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 2021-11-05
    相关资源
    最近更新 更多