Android 交叉编译时链接器错误

2024-03-02

我想为 Android 交叉编译我的项目。我创建了 ~/.cargo/config 如下:-

[target.armv7-linux-androideabi]
ar = "/optHDD/AndroidNDK/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar"
linker = "/optHDD/AndroidNDK/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi26-clang"

这是我的项目的 Cargo.toml 文件:-

[package]
name = "examer"
version = "0.1.0"
authors = ["none"]
edition = "2018"

[dependencies]
tokio = { version = "0.2", features = ["full"] }
lazy_static = "1"
clap = "2.*"
futures = { version = "0.3", default-features = false, features = ["alloc"] }
futures-util = "0.3"
async-tungstenite = { version = "*", features= ["tokio-runtime"] }
mongodb =  { version = "1.*", features = ["tokio-runtime"] }
pbkdf2 = "0.2"
# serde = { version = "1.0", features = ["derive", "rc"] }
serde_cbor = "0.11"
derive_builder = "0.9.0"
# serde_derive = "1.0"

[dev-dependencies]
tungstenite = "0.11"
url = "2"

[lib]
name = "libexamer"
path = "src/lib.rs"

[[bin]]
name = "examer"
path = "src/main.rs"                                                                                                                            

它在桌面 Linux 上编译和工作正常

但它不适合 Android Linux 编译。我已经用 rustup 添加了目标 armv7-linux-androideabi

❯ cargo build --target armv7-linux-androideabi

      ... Compling Very long list of packages So i trimmed it...

error: failed to run custom build command for `openssl-sys v0.9.58`

Caused by:
  process didn't exit successfully: `/home/noone/examer/target/debug/build/openssl-sys-d34551fe3fadea5f/build-script-main` (exit code: 101)
--- stdout
cargo:rustc-cfg=const_fn
cargo:rerun-if-env-changed=ARMV7_LINUX_ANDROIDEABI_OPENSSL_LIB_DIR
ARMV7_LINUX_ANDROIDEABI_OPENSSL_LIB_DIR unset
cargo:rerun-if-env-changed=OPENSSL_LIB_DIR
OPENSSL_LIB_DIR unset
cargo:rerun-if-env-changed=ARMV7_LINUX_ANDROIDEABI_OPENSSL_INCLUDE_DIR
ARMV7_LINUX_ANDROIDEABI_OPENSSL_INCLUDE_DIR unset
cargo:rerun-if-env-changed=OPENSSL_INCLUDE_DIR
OPENSSL_INCLUDE_DIR unset
cargo:rerun-if-env-changed=ARMV7_LINUX_ANDROIDEABI_OPENSSL_DIR
ARMV7_LINUX_ANDROIDEABI_OPENSSL_DIR unset
cargo:rerun-if-env-changed=OPENSSL_DIR
OPENSSL_DIR unset
cargo:rerun-if-env-changed=OPENSSL_NO_PKG_CONFIG
cargo:rerun-if-env-changed=PKG_CONFIG_ALLOW_CROSS_armv7-linux-androideabi
cargo:rerun-if-env-changed=PKG_CONFIG_ALLOW_CROSS_armv7_linux_androideabi
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_armv7-linux-androideabi
cargo:rerun-if-env-changed=PKG_CONFIG_armv7_linux_androideabi
cargo:rerun-if-env-changed=TARGET_PKG_CONFIG
cargo:rerun-if-env-changed=PKG_CONFIG
cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_armv7-linux-androideabi
cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_armv7_linux_androideabi
cargo:rerun-if-env-changed=TARGET_PKG_CONFIG_SYSROOT_DIR
cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR
run pkg_config fail: "Cross compilation detected. Use PKG_CONFIG_ALLOW_CROSS=1 to override"

--- stderr
thread 'main' panicked at '

Could not find directory of OpenSSL installation, and this `-sys` crate cannot
proceed without this knowledge. If OpenSSL is installed and this crate had
trouble finding it,  you can set the `OPENSSL_DIR` environment variable for the
compilation process.

Make sure you also have the development packages of openssl installed.
For example, `libssl-dev` on Ubuntu or `openssl-devel` on Fedora.

If you're in a situation where you think the directory *should* be found
automatically, please open a bug at https://github.com/sfackler/rust-openssl
and include information about your system as well as this message.

$HOST = x86_64-unknown-linux-gnu
$TARGET = armv7-linux-androideabi
openssl-sys = 0.9.58

', /home/noone/.cargo/registry/src/github.com-1ecc6299db9ec823/openssl-sys-0.9.58/build/find_normal.rs:157:5
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_ALLOW_CROSS=1 但它也失败了

❯ PKG_CONFIG_ALLOW_CROSS=1 cargo build --target armv7-linux-androideabi
   Compiling ring v0.16.15
   Compiling openssl-sys v0.9.58
   Compiling proc-macro2 v0.4.30
   Compiling httparse v1.3.4
   Compiling quote v1.0.7
   Compiling getrandom v0.1.14
   Compiling generic-array v0.12.3
   Compiling net2 v0.2.34
error: failed to run custom build command for `ring v0.16.15`

Caused by:
  process didn't exit successfully: `/home/noone/examer/target/debug/build/ring-039ac27f87884aa1/build-script-build` (exit code: 101)
--- stdout
OPT_LEVEL = Some("0")
TARGET = Some("armv7-linux-androideabi")
HOST = Some("x86_64-unknown-linux-gnu")
CC_armv7-linux-androideabi = None
CC_armv7_linux_androideabi = None
TARGET_CC = None
CC = None
CFLAGS_armv7-linux-androideabi = None
CFLAGS_armv7_linux_androideabi = None
TARGET_CFLAGS = None
CFLAGS = None
CRATE_CC_NO_DEFAULTS = None
DEBUG = Some("true")

--- stderr
ENV ANDROID_HOME=/optHDD/AndroidSDK
ENV ANDROID_NDK=/optHDD/AndroidNDK
ENV ANDROID_NDK_ROOT=/optHDD/AndroidNDK
ENV ANDROID_SDK_ROOT=/optHDD/AndroidSDK
ENV BINARYEN=/usr
ENV BINARYEN_ROOT=/usr
ENV CARGO=/home/noone/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/bin/cargo
ENV CARGO_CFG_TARGET_ARCH=arm
ENV CARGO_CFG_TARGET_ENDIAN=little
ENV CARGO_CFG_TARGET_ENV=
ENV CARGO_CFG_TARGET_FAMILY=unix
ENV CARGO_CFG_TARGET_OS=android
ENV CARGO_CFG_TARGET_POINTER_WIDTH=32
ENV CARGO_CFG_TARGET_VENDOR=unknown
ENV CARGO_CFG_UNIX=
ENV CARGO_FEATURE_ALLOC=1
ENV CARGO_FEATURE_DEFAULT=1
ENV CARGO_FEATURE_DEV_URANDOM_FALLBACK=1
ENV CARGO_FEATURE_ONCE_CELL=1
ENV CARGO_HOME=/home/noone/.cargo
ENV CARGO_MAKEFLAGS=--jobserver-fds=5,6 -j --jobserver-auth=5,6 -j
ENV CARGO_MANIFEST_DIR=/home/noone/.cargo/registry/src/github.com-1ecc6299db9ec823/ring-0.16.15
ENV CARGO_MANIFEST_LINKS=ring-asm
ENV CARGO_PKG_AUTHORS=Brian nooneh <[email protected] /cdn-cgi/l/email-protection>
ENV CARGO_PKG_DESCRIPTION=Safe, fast, small crypto using Rust.
ENV CARGO_PKG_HOMEPAGE=
ENV CARGO_PKG_NAME=ring
ENV CARGO_PKG_REPOSITORY=https://github.com/briannooneh/ring
ENV CARGO_PKG_VERSION=0.16.15
ENV CARGO_PKG_VERSION_MAJOR=0
ENV CARGO_PKG_VERSION_MINOR=16
ENV CARGO_PKG_VERSION_PATCH=15
ENV CARGO_PKG_VERSION_PRE=
ENV LD_LIBRARY_PATH=/home/noone/examer/target/debug/deps:/home/noone/examer/target/debug:/home/noone/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib:/home/noone/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib
ENV NUM_JOBS=8
ENV OPT_LEVEL=0
ENV OUT_DIR=/home/noone/examer/target/armv7-linux-androideabi/debug/build/ring-bb7f58c397198b7c/out
ENV PATH=/home/noone/.cargo/bin:/opt/google-cloud-sdk/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/lib/emscripten:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/home/noone/.gem/ruby/2.7.0/bin:/opt/scripts:/usr/lib/servo:/home/noone/.rvm/bin
ENV PKG_CONFIG_ALLOW_CROSS=1
ENV PROFILE=debug
ENV RUSTC=rustc
ENV RUSTC_LINKER=/optHDD/AndroidNDK/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi26-clang
ENV RUSTDOC=rustdoc
ENV RUSTUP_HOME=/home/noone/.rustup
ENV RUSTUP_TOOLCHAIN=stable-x86_64-unknown-linux-gnu
ENV RUST_RECURSION_COUNT=1
ENV SHELL=/bin/sh
ENV SHELL_SESSION_ID=2f2df9d05d444290bf71a1767feb62d7
ENV SHLVL=1
ENV SSL_CERT_DIR=/etc/ssl/certs
ENV SSL_CERT_FILE=/etc/ssl/cert.pem
ENV TARGET=armv7-linux-androideabi
ENV _=/usr/bin/cargo
running "arm-linux-androideabi-clang" "-O0" "-DANDROID" "-ffunction-sections" "-fdata-sections" "-fPIC" "-g" "-fno-omit-frame-pointer" "--target=armv7-linux-androideab-I" "include" "-Wall" "-Wextra" "-pedantic" "-pedantic-errors" "-Wall" "-Wextra" "-Wcast-align" "-Wcast-qual" "-Wconversion" "-Wenum-compare" "-Wfloat-equal" "-Wformat"-Winline" "-Winvalid-pch" "-Wmissing-field-initializers" "-Wmissing-include-dirs" "-Wredundant-decls" "-Wshadow" "-Wsign-compare" "-Wsign-conversion" "-Wundef" "-Wunialized" "-Wwrite-strings" "-fno-strict-aliasing" "-fvisibility=hidden" "-fstack-protector" "-g3" "-DNDEBUG" "-c" "-o/home/noone/examer/target/armv7-linux-androideabi/debuild/ring-bb7f58c397198b7c/out/aesv8-armx-linux32.o" "/home/noone/.cargo/registry/src/github.com-1ecc6299db9ec823/ring-0.16.15/pregenerated/aesv8-armx-linux32.S"
thread 'main' panicked at 'failed to execute ["arm-linux-androideabi-clang" "-O0" "-DANDROID" "-ffunction-sections" "-fdata-sections" "-fPIC" "-g" "-fno-omit-frame-poi" "--target=armv7-linux-androideabi" "-I" "include" "-Wall" "-Wextra" "-pedantic" "-pedantic-errors" "-Wall" "-Wextra" "-Wcast-align" "-Wcast-qual" "-Wconversion" "-Wecompare" "-Wfloat-equal" "-Wformat=2" "-Winline" "-Winvalid-pch" "-Wmissing-field-initializers" "-Wmissing-include-dirs" "-Wredundant-decls" "-Wshadow" "-Wsign-compareWsign-conversion" "-Wundef" "-Wuninitialized" "-Wwrite-strings" "-fno-strict-aliasing" "-fvisibility=hidden" "-fstack-protector" "-g3" "-DNDEBUG" "-c" "-o/home/noone/ex/target/armv7-linux-androideabi/debug/build/ring-bb7f58c397198b7c/out/aesv8-armx-linux32.o" "/home/noone/.cargo/registry/src/github.com-1ecc6299db9ec823/ring-0.16.15/prerated/aesv8-armx-linux32.S"]: No such file or directory (os error 2)', /home/noone/.cargo/registry/src/github.com-1ecc6299db9ec823/ring-0.16.15/build.rs:661:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

warning: build failed, waiting for other jobs to finish...
error: build failed

经过一番谷歌搜索后,我发现人们建议手动设置 AR 和 CC 环境变量,所以我也这样做了

❯ CC=/optHDD/AndroidNDK/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi26-clang AR=/optHDD/AndroidNDK/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar PKG_CONFIG_ALLOW_CROSS=1  cargo build --target armv7-linux-androideabi
   Compiling openssl-sys v0.9.58
      ... Compling Very long list of packages So i trimmed it...
   
error: linking with `/optHDD/AndroidNDK/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi26-clang` failed: exit code: 1
  |
  = note: "/optHDD/AndroidNDK/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi26-clang" "-Wl,--as-needed" "-Wl,-z,noexecstack" "-Wl,--allow-multiple-definition" "-march=armv7-a" "-L" <...very long list of files...> "-Wl,-Bdynamic" "-lssl" "-lcrypto" "-ldl" "-llog" "-lgcc" "-lc" "-lm"
  = note: /optHDD/AndroidNDK/toolchains/llvm/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lssl
          /optHDD/AndroidNDK/toolchains/llvm/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lcrypto
          /home/noone/.cargo/registry/src/github.com-1ecc6299db9ec823/openssl-0.10.30/src/error.rs:184: error: undefined reference to 'ERR_lib_error_string'
          /home/noone/.cargo/registry/src/github.com-1ecc6299db9ec823/openssl-0.10.30/src/error.rs:196: error: undefined reference to 'ERR_func_error_string'
          /home/noone/.cargo/registry/src/github.com-1ecc6299db9ec823/openssl-0.10.30/src/error.rs:208: error: undefined reference to 'ERR_reason_error_string'
          /home/noone/.cargo/registry/src/github.com-1ecc6299db9ec823/openssl-0.10.30/src/x509/mod.rs:1272: error: undefined reference to 'X509_verify_cert_error_string'
          /home/noone/.cargo/registry/src/github.com-1ecc6299db9ec823/openssl-sys-0.9.58/src/lib.rs:105: error: undefined reference to 'OPENSSL_init_ssl'
          clang: error: linker command failed with exit code 1 (use -v to see invocation)
          

error: aborting due to previous error

error: could not compile `examer`.

To learn more, run the command again with --verbose.


我通过在 Cargo.toml 中添加以下内容暂时解决了这个问题

[target.armv7-linux-androideabi.dependencies]
openssl = { version = "*", features = ["vendored"] }

features = ["vendored"]为我静态构建 openssl 。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 交叉编译时链接器错误 的相关文章

随机推荐

  • 使用 jQuery 获取大括号中无效的 HTML 代码

    我有一些 无效的 HTML 代码我无法改变 a href a a href a 使用 jQuery 我选择两个锚点之一 function someFunction id text id 现在 我想获取大括号内的文本 因此对于id 1这意味着
  • 我应该为多客户端应用程序使用单个还是多个数据库设置? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在开发一个 PHP 应用程序 旨在简化公司工作流程和项目管理 比如说Basecamp http www basecamphq com and
  • 如何在tinymce中禁用复制/粘贴

    我在我的网站上使用tinymce RTF 编辑器 我想禁用tinymce文本区域中的复制 粘贴选项 我在 stackoverflow 上找到了这个方法 但它对我不起作用 如何防止 禁用 Tinymce 中的复制和粘贴 https stack
  • 为什么不能将字符串文字连接到 __FUNCTION__?

    Isn t FUNCTION 字符串文字 我一直以为是这样的 FILE 但我刚刚发现我无法将字符串文字与其相邻连接 如果它不是字符串文字 那么它的定义是什么 我无法让 cscope 解决它 E g include
  • Keras ImageDataGenerator 中的增强

    我有两个关于 ImageDataGenerator 的问题 1 整批图像是否使用相同的增强 或者每个图像都有自己的随机变换 例如对于旋转 模块是否以相同的角度旋转批次中的所有图像 或者每个图像获得随机旋转角度 2 ImageDataGene
  • C++ 匿名结构

    我使用以下联合来简化字节 半字节和位操作 union Byte struct unsigned int bit 0 1 unsigned int bit 1 1 unsigned int bit 2 1 unsigned int bit 3
  • EF 迁移应该去哪里,我的类库项目还是我的 ASP.NET 项目?

    我的解决方案包含 FooBarAsp 一个asp项目 为应用程序提供UI FooBar 一个类库 应用程序 FooBar 测试 一个测试项目 测试应用程序 FooBar 使用 EF 6 Code First 并包含许多模型和一个DataCo
  • 你能在不破坏后退按钮的情况下拦截 UIWebView 中的 NSURLRequests 吗?

    我在将自定义 HTML 加载到我的UIWebView不破坏其goBack method 什么有效 我正在拦截我的 URL 请求UIWebView这样我就可以加载自定义 HTML 我可以控制所有 HTML 因此我的特殊应用程序请求使用自定义方
  • 如何在保存或编辑文件 tfs 时禁用自动签出

    请告诉我如何在编辑或保存文件时禁用 tfs 与 2013 中的自动结帐 我可以在 选项 对话框中选择 不执行任何操作 单击 源代码管理 然后单击 环境 然后在 编辑时 框中选择 不执行任何操作 然后选择 允许编辑签入的项目 但这不会无法解决
  • 是否可以一次向 pandas DataFrame 添加多个列?

    如果我想创建一个包含多个列的新 DataFrame 我可以一次添加所有列 例如 如下所示 data col 1 0 1 2 3 col 2 4 5 6 7 df pd DataFrame data 但现在假设我想向此 DataFrame 添
  • 如何在wpf中刷新窗口?

    我正在开发一个小项目 它是一个带有 4 个 WPF 选项卡的窗口 第一个选项卡是我完成大部分工作的地方 但有时我需要移回其他选项卡 其中一个选项卡有一个 DataGrid 它绑定到一个受我所在的主选项卡影响的列表 当我在第一个选项卡上更新某
  • android.support.v7.widget.SwitchCompat 周围的选择框

    我试图在我的应用程序中模仿新的材料设计开关 并且 switchcompat 工作得很好 唯一的问题是触摸开关周围会出现一个灰色的选择框 这确实破坏了干净的外观 这是我可以删除的东西吗 Use
  • 如何使用 Xamarin Forms 查看 PDF 文件

    有什么方法可以使用 xamarin 表单来查看 PDF 文件而不使用自定义渲染器 Android public void OpenPdf string filePath Android Net Uri uri Android Net Uri
  • 如何阻止机器人和垃圾邮件提交评论?

    现在 我正在使用验证码图像 我创建了文本字段并使用 JavaScript 隐藏它 我希望它的值在服务器端为空 因为机器人应该填写表单上的所有字段 如果值不为空 则不会处理注释 我还使用时间戳来检查提交评论花了多长时间 我想如果评论是在 15
  • Grails 内联插件:无法升级通过 BuildConfig.groovy 配置的插件

    我们的应用程序分为一个主应用程序和一些插件 我们通过 BuildConfig groovy 文件使用内联插件 当需要对整个生产进行 WAR 时 我收到以下消息 您无法升级以下插件 通过 BuildConfig groovy 配置 删除配置以
  • 国际化 Web 应用程序的最佳实践?

    国际化网络应用程序似乎总是一件苦差事 无论您对可插入语言做了多少计划 总会存在编码问题 不适合您的模板的时髦措辞以及其他问题 我认为 获得 SO 社区的意见是很有用的 程序员在决定将其 Web 应用程序国际化时应该注意这些事项 国际化很困难
  • 如何从地址栏搜索网站

    当我写 stackoverflow com 或 bing com 然后在 google chrome URL 中输入空格时 它会添加 搜索 stackoverflow 或 搜索 bing 那么我们需要在网络应用程序中实现什么才能让 goog
  • 以 vsdoc 格式记录 javascript 的 T 类型数组,我发现错误了吗?

    下列的这些 vsdoc 文档指南 http weblogs asp net bleroy archive 2007 04 23 the format for javascript doc comments aspx 我无法让智能感知对给定类
  • XmlSchema.Read 给出 COMException“灾难性失败”

    我有一个实用程序类 其中包含一些与 XML 模式相关的方法 在没有任何代码更改或对环境进行任何已知更改的情况下 它突然开始出现系统性故障 失败的方法 public static XmlSchema GetSchema string xsdF
  • Android 交叉编译时链接器错误

    我想为 Android 交叉编译我的项目 我创建了 cargo config 如下 target armv7 linux androideabi ar optHDD AndroidNDK toolchains llvm prebuilt l