如何解决交叉编译 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-config
和 libudev-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 举报,一经查实,本站将立刻删除。