交叉编译armv5te未知linux gneabi Rust的共享库[Mindstorm Ev3dev]



参数:

  • 源=x86x64 windows 10或x86x64 linux(ubuntu wsl)
  • target=armv5te-linux
  • target_type=cdylib
  • target_glibc=2.24
  • language=锈蚀
  • build_tool=货物
  • 编译器=rustc

(目标是运行Ev3dev linux映像的Lego Mindstorm)

货物配置:

[package]
name = "ev3"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
jni = "0.19"
ev3dev-lang-rust = { version = "0.12.1", features=["screen"]}
jni_proc_macro= {path= "./jni_proc_macro"}
[lib]
crate-type= ["cdylib"]
[workspace]
members= ["jni_proc_macro"]

构建配置:

[build]
target = "armv5te-unknown-linux-gnueabi"
[target.armv5te-unknown-linux-gnueabi]
linker = "rust-lld"

生成错误:

error: linking with `rust-lld` failed: exit code: 1
|
= note: {...}
= note:   rust-lld: error: unable to find library -lgcc_s
rust-lld: error: unable to find library -lutil
rust-lld: error: unable to find library -lrt
rust-lld: error: unable to find library -lpthread
rust-lld: error: unable to find library -lm
rust-lld: error: unable to find library -ldl
rust-lld: error: unable to find library -lc

error: could not compile `ev3` due to previous error

由于该错误表明链接器缺少库。我找不到可以下载和/或提供这些依赖关系的明确解决方案

我的问题是,A是否有一种不同的方法来成功构建它,或者B我如何解决这些依赖关系

结果需要为linux和armv5te创建一个共享库(.so)

要求

安装了
  • wsl或linux
  • 已安装货物和防锈漆

(所有操作都在wsl/linux中完成)

准备/构建

在货物上安装十字架

cargo install cross --git https://github.com/cross-rs/cross

安装docker
克隆跨存储库
导航到docker文件夹
创建一个名为"armv5te未知linux gnueabi cross">
将其粘贴到新文件中:

FROM ubuntu:16.04
ARG DEBIAN_FRONTEND=noninteractive
COPY common.sh lib.sh /
RUN /common.sh
COPY cmake.sh /
RUN /cmake.sh
COPY xargo.sh /
RUN /xargo.sh
RUN apt-get update && apt-get install --assume-yes --no-install-recommends 
g++-arm-linux-gnueabi 
crossbuild-essential-armel 
libc6-dev-armel-cross
COPY deny-debian-packages.sh /
RUN TARGET_ARCH=armel /deny-debian-packages.sh 
binutils 
binutils-arm-linux-gnueabi
# Qemu is disabled since we've changed the scripts to require newer Python versions.
#COPY qemu.sh /
#RUN /qemu.sh arm
COPY qemu-runner base-runner.sh /
ENV CROSS_TOOLCHAIN_PREFIX=arm-linux-gnueabi-
ENV CROSS_SYSROOT=/usr/arm-linux-gnueabi
ENV CARGO_TARGET_ARMV5TE_UNKNOWN_LINUX_GNUEABI_LINKER="$CROSS_TOOLCHAIN_PREFIX"gcc 
CARGO_TARGET_ARMV5TE_UNKNOWN_LINUX_GNUEABI_RUNNER="/qemu-runner arm" 
AR_armv5te_unknown_linux_gnueabi="$CROSS_TOOLCHAIN_PREFIX"ar 
CC_armv5te_unknown_linux_gnueabi="$CROSS_TOOLCHAIN_PREFIX"gcc 
CXX_armv5te_unknown_linux_gnueabi="$CROSS_TOOLCHAIN_PREFIX"g++ 
BINDGEN_EXTRA_CLANG_ARGS_armv5te_unknown_linux_gnueabi="--sysroot=$CROSS_SYSROOT" 
QEMU_LD_PREFIX="$CROSS_SYSROOT" 
RUST_TEST_THREADS=1 
PKG_CONFIG_PATH="/usr/lib/arm-linux-gnueabi/pkgconfig/:${PKG_CONFIG_PATH}"

确保项目使用";LF";换行符。如果没有,则修复它。
在克隆存储库的根目录中使用以下命令编译自定义交叉/码头构建:

cargo build-docker-image armv5te-unknown-linux-gnueabi-cross

这将创建一个新的docker映像,用于编译rust代码
然后导航到目标项目文件夹并运行:

export CROSS_TARGET_ARMV5TE_UNKNOWN_LINUX_GNUEABI_IMAGE=ghcr.io/cross-rs/armv5te-unknown-linux-gnueabi-cross:local

(不要关闭此终端)
现在将以下内容添加到Cargo.toml文件中:

[package.metadata.cross.build]
default-target = "armv5te-unknown-linux-gnueabi"

现在你可以运行:

cross build 

许多货物选择,如"--释放";可以使用

学分

  • MeetTitan(堆栈溢出)建议我使用十字架
  • 为整个解决方案提供动力的跨项目(GitHub)
  • 自定义跨版本讨论(跨Github)
  • Alexhuszagh(Cross Github)向我展示了如何构建自定义的跨版本
  • Emilgardis(Cross Github)解释了换行错误

相关内容

  • 没有找到相关文章

最新更新