交叉编译 Rust 与 Cargo 尝试与主机库链接

问题描述 投票:0回答:1

我正在尝试将一个包从 FreeBSD 13.1 x86_64 主机交叉编译到 FreeBSD 13.1 aarch64 目标。我已经成功地将我的包从 FreeBSD 12.1 x86_64 交叉编译到 FreeBSD 12.1 aarch64。

为此,我有以下环境:

cargo version
cargo 1.67.0-nightly (f6e737b1e 2022-12-02)

rustc --version
rustc 1.67.0-nightly (01fbc5ae7 2022-12-07)

export AARCH64_SYSROOT=/path/to/aarch64/root
export PKG_CONFIG_SYSROOT_DIR=$AARCH64_SYSROOT
export RUSTFLAGS="-C link-args=-fuse-ld=lld -C link-args=-L$AARCH64_SYSROOT/usr/lib -C link-args=-L$AARCH64_SYSROOT/lib -C link-args=-L$AARCH64_SYSROOT/usr/local/lib -C link-args=--sysroot=$AARCH64_SYSROOT"

我运行构建的命令如下,我在 FreeBSD 13.1 上收到此错误:

cargo build -Z build-std --release --target aarch64-unknown-freebsd

ld.lld: error: /usr/local/lib/libssl.so is incompatible with $AARCH64_SYSROOT/usr/lib/Scrt1.o
ld.lld: error: /usr/local/lib/libcrypto.so is incompatible with $AARCH64_SYSROOT/usr/lib/Scrt1.o
ld.lld: error: /usr/local/lib/libcurl.so is incompatible with $AARCH64_SYSROOT/usr/lib/Scrt1.o
cc: error: linker command failed with exit code 1 (use -v to see invocation)

看起来链接器正在尝试链接我的主机库,即使我在

RUSTFLAGS
中指定了链接路径。

我在两台机器上运行带有

--verbose
标志的货物,发现
-L native=/usr/local/lib
出现在 FreeBSD 13.1 上,但
-L native=$AARCH64_SYSROOT/usr/local/lib
出现在 FreeBSD 12.1 上,所以我认为这是一个相当大的线索,但我可能完全错了。

为什么我的主机库路径出现在 FreeBSD13 上,但没有出现在 FreeBSD12 上?运行

cargo build
命令时如何删除此默认标志?

我尝试使用

cargo build --verbose
显示的命令直接调用 rustc (删除
-L native=/usr/local/lib
选项),这似乎有效。然而,这是不切实际的,因为我的板条箱有很多依赖项,并且在不使用货物的情况下正确构建会变得一团糟......

rust x86-64 cross-compiling freebsd arm64
1个回答
0
投票

您不应该依赖

-I
-L
来定位您的交叉库(这只会将外部库添加到您的主机库集中,创建混合),而是指示工具链使用交叉 sysroot 而不是主机系统根目录。

这可以按照其他答案中描述的来完成。

请注意,对于使用 Linux 容器进行交叉编译,

cross-rs 项目拥有带有工具链和基本 sysroot 的交钥匙容器。它们可能适合创建 Jails 容器吗?

© www.soinside.com 2019 - 2024. All rights reserved.