【问题标题】:Cross compile shared library for armv5te-unknown-linux-gnueabi Rust [Mindstorm Ev3dev]交叉编译 armv5te-unknown-linux-gnueabi Rust 的共享库 [Mindstorm Ev3dev]
【发布时间】:2022-11-23 23:00:20
【问题描述】:

参数:

  • source = x86_x64 windows 10 或 x86_x64 linux (ubuntu wsl)
  • 目标= armv5te linux
  • target_type = cdylib
  • target_glibc = 2.24
  • 语言=生锈
  • 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)

【问题讨论】:

  • 您是否设置了目标平台工具链?如果没有,您是否调查过Cross
  • 我只是简单地浏览了一下 cross md。他们说他们支持我的目标。看来我需要先设置 docker。对于您的第一个问题:我使用 rustup target add 安装了工具链... musl 和 gnu 版本。都成功编译了 staticlib。 Musl 不支持动态库,gnu 给我上面的错误。
  • 是的,您需要设置 docker;但这可能更容易,因为根据您的平台,手动设置工具链可能会很麻烦。它不像rustup install <triplet>那么简单,你仍然需要一个 armv5te-unknown-linux 链接器和 armv5te-unknown-linux 库,你需要正确地指向它们(交叉容器化很容易,你几乎得到安装和配置了所有这些零碎的目标机器的虚拟机)。 Musl 还应该支持动态库,如果我没记错的话,它只是默认情况下静态链接的不同 libc。
  • 那我试试docker。我认为找到一个链接器和一个平台的库不会那么困难。但我真的找不到任何东西。 Musl 不支持动态库是一个实现问题。在一个关于工具链的 rust 网站上写到“一些工具链被硬编码用于静态链接”,armv5te musl 就是其中之一。无论哪种方式,gnu 静态链接也可以工作,所以我假设即使 musl 支持动态库,我也会遇到同样的问题。
  • 你应该写下答案;记录您采取的步骤以及对您有用的步骤。它会帮助某人进行 Google 搜索,我会给你一个提升

标签: linux rust shared-libraries cross-compiling lego-mindstorms-ev3


【解决方案1】:

要求

  • 已安装 wsl 或 linux
  • cargo 和 rustc 已安装

(一切都在 wsl/linux 中完成)

准备/构建

在货物上安装十字架

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

安装泊坞窗
克隆交叉存储库
导航到 docker 文件夹
创建一个名为“Dockerfile.armv5te-unknown-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”换行符。如果不是this修复它。
在克隆存储库的根目录中使用以下命令编译自定义 cross/docker 构建:

cargo build-docker-image arm5te-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 

可以使用许多货物选项,如“--release”(有关更多信息,请查看 cross in the credits)

学分

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 2021-04-26
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    相关资源
    最近更新 更多