针对Raspberry Pi 2的交叉编译rust openssl

针对Raspberry Pi 2的交叉编译rust openssl,openssl,raspberry-pi,rust,cross-compiling,Openssl,Raspberry Pi,Rust,Cross Compiling,我在Debian机器上,我想为我的Raspberry Pi 2交叉编译一个项目。我已经使用Rustop为一个简单的hello world实现了这一点,但是我不知道如何交叉编译rust openssl板条箱 我已经用arm linux gnueabihf gcc编译了openssl,并将其安装在我的主页/opensslArm目录中 当我跑的时候 OPENSSL_LIB_DIR=/home/johann/opensslArm/LIB OPENSSL_INCLUDE_DIR=/home/johann/

我在Debian机器上,我想为我的Raspberry Pi 2交叉编译一个项目。我已经使用Rustop为一个简单的hello world实现了这一点,但是我不知道如何交叉编译rust openssl板条箱

我已经用arm linux gnueabihf gcc编译了openssl,并将其安装在我的
主页/opensslArm
目录中

当我跑的时候

OPENSSL_LIB_DIR=/home/johann/opensslArm/LIB OPENSSL_INCLUDE_DIR=/home/johann/opensslArm/INCLUDE cargo build--target=armv7未知linux gnueabihf
我得到这个错误:

无法为“openssl sys extras v0.7.11”运行自定义生成命令`
进程未成功退出:`/home/johann/projects/test/target/debug/build/openssl-sys-extras-e1c84960cd35bc93/build script build`(退出代码:101)
---stdout
TARGET=Some(“armv7未知linux gnueabihf”)
OPT_级别=一些(“0”)
PROFILE=Some(“调试”)
TARGET=Some(“armv7未知linux gnueabihf”)
调试=真实选项级别=0
HOST=Some(“x86_64-unknown-linux-gnu”)
TARGET=Some(“armv7未知linux gnueabihf”)
TARGET=Some(“armv7未知linux gnueabihf”)
HOST=Some(“x86_64-unknown-linux-gnu”)
CC_armv7-unknown-linux-gnueabihf=None
CC_armv7_未知_linux_gnueabihf=None
目标_CC=无
CC=无
HOST=Some(“x86_64-unknown-linux-gnu”)
TARGET=Some(“armv7未知linux gnueabihf”)
HOST=Some(“x86_64-unknown-linux-gnu”)
CFLAGS_armv7-unknown-linux-gnueabihf=None
CFLAGS_armv7_unknown_linux_gnueabihf=None
目标值=无
CFLAGS=无
正在运行:“arm linux gnueabihf gcc”“-O0”“-f函数节”“-fdata节”“-g”“-fPIC”“-march=armv7-a”“-o”“/home/johann/projects/test/target/armv7未知linux gnueabihf/debug/build/openssl-sys-extras-e1c84960cd35bc93/out/src/openssl_shim.o”“-c”“src/openssl_shim.c”
出口状态(出口状态(256))
命令未成功执行,获取:退出代码:1
---斯特德尔
在src/openssl_shim.c中包含的文件中:1:0:
/usr/include/openssl/hmac.h:61:34:致命错误:openssl/opensslconf.h:没有这样的文件或目录
编译终止。
线程“”在“显式恐慌”时恐慌,/home/johann/.cargo/registry/src/github.com-88ac128001ac3a9a/gcc-0.3.28/src/lib.rs:840
注意:使用'RUST_BACKTRACE=1'运行回溯跟踪。
如果我导出有问题的变量,我会得到同样的错误

我不知道我应该做什么,我不是交叉编译方面的专家。有人做到了吗

编辑:我使用的是rust openssl 0.7.11。升级到0.7.13修复了此问题(我现在可以看到openssl依赖项没有错误),但我现在有另一个问题:

error: linking with `arm-linux-gnueabihf-gcc` failed: exit code: 1
...

note: /usr/lib/gcc-cross/arm-linux-gnueabihf/5/../../../../arm-linux-gnueabihf/bin/ld: /home/johann/opensslArm/lib/libssl.a(s23_meth.o): relocation R_ARM_THM_MOVW_ABS_NC against `a local symbol' can not be used when making a shared object; recompile with -fPIC
/home/johann/opensslArm/lib/libssl.a: error adding symbols: Bad value

如何添加
-fPIC
标志?我是否应该使用特定标志重新编译opensslArm?

在配置openssl编译时,必须传递
共享
选项(这将使
-fPIC
参数传递给编译器)

下面是我用来测试交叉编译打印openssl版本的Rust程序的一系列命令:

cd/tmp
wgethttps://www.openssl.org/source/openssl-1.0.1t.tar.gz
tar xzf openssl-1.0.1t.tar.gz
导出机器=armv7
导出ARCH=arm
export CC=arm linux gnueabihf gcc
cd openssl-1.0.1t&&./config共享&&make&&cd-
导出OPENSSL_LIB_DIR=/tmp/OPENSSL-1.0.1t/
导出OPENSSL\u INCLUDE\u DIR=/tmp/OPENSSL-1.0.1t/INCLUDE
新货柜箱
cd xx
mkdir.货物

cat>.cargo/config src/main.rs这是一个较老的问题,但它在Google上表现得很好,所以我想指出,现在您不需要手动编译OpenSSL(如果您不想)。
openssl
板条箱提供了一种在构建项目时从源代码编译openssl的方法

通过向您的
货物添加类似的内容,您可以将此功能传播到您自己的项目中,以选择性地依赖于
供应商

[features]
...

# If compiling on a system without OpenSSL installed, or cross-compiling for a different
# architecture, enable this feature to compile OpenSSL as part of the build.
# See https://docs.rs/openssl/#vendored for more.
static_ssl = ['openssl/vendored']

[dependencies]
...

[dependencies.openssl]
optional = true
version = ...
在构建项目时启用
static\u ssl
功能将针对与构建其余部分相同的目标体系结构编译OpenSSL


详细介绍了使用OpenSSL进行编译的不同方法。

在输出中包含
/usr/include/OpenSSL/hmac.h
,这确实令人怀疑。这将是您通常安装的OpenSSL版本,而不是自定义版本。我不知道这是否会引起问题…谢谢你的评论!我尝试克隆rust openssl并手动编译openssl sys extra。。。成功了!!所以我做了一个
货物更新
,rust openssl从0.7.11升级到了0.7.13,现在我有一个
链接到
arm linux gnueabihf gcc`failed`错误