交叉编译 Rust 的 SerialPort 包

Noc*_*ker 1 linux serial-port cross-compiling rust arm64

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

我已将目标添加到 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
...

Run Code Online (Sandbox Code Playgroud)

我已经安装了 rustup 工具链:

$ rustup toolchain list
stable-aarch64-unknown-linux-gnu
stable-x86_64-unknown-linux-gnu (default)
Run Code Online (Sandbox Code Playgroud)

当我运行 Cargo build 命令时,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
Run Code Online (Sandbox Code Playgroud)

我已经安装了pkg-config并且libudev-dev. 从终端我可以得到以下输出来确认 pkg-config 已安装:

$ pkg-config --version
0.29.1
Run Code Online (Sandbox Code Playgroud)

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

$ libudev
libudev: command not found
$ libudev-dev
libudev-dev: command not found
Run Code Online (Sandbox Code Playgroud)

当我尝试再次安装 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.
Run Code Online (Sandbox Code Playgroud)

当我尝试安装 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
Run Code Online (Sandbox Code Playgroud)

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

小智 5

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

serialport = {version = "4.0.1", default-features = false}
Run Code Online (Sandbox Code Playgroud)

另请参阅此处的描述: 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.
Run Code Online (Sandbox Code Playgroud)