如何使用openssl交叉编译rust项目?

时间:2019-02-19 21:19:11

标签: rust cross-compiling grpc

我的项目是用Rust(Ubuntu 16.04, CMake 3.5.1)编写的。

以前,它在grpcio = "0.4.0"中使用Cargo.toml作为依赖项,我可以成功地对其进行交叉编译(即,创建静态二进制文件)(使用cross)。但是,在将依存关系更改为grpcio = { version = "0.4.2", features = ["openssl"] }之后,我无法再对其进行交叉编译:它表示无法编译grpcio-sys = "0.4.2"并显示一些CMake错误(而且我无法继续使用0.4.0,因为它不支持features=["openssl"]):

  1. 找不到sudo apt-get install libssl-dev的OpenSSL环境标志(即使我安装了Ubuntu 16.04)。
  2. gRPC_PROTOBUF_PROVIDER is "module" but PROTOBUF_ROOT_DIR is wrong

我该如何解决? This帖子说我应该完全避免使用OpenSSL。还有另一个post关于使用OpenSSL进行交叉编译。

2 个答案:

答案 0 :(得分:0)

您不能使用 Openssl 的所有功能来交叉编译rust程序,因为某些版本的OpenSSL不支持(以供应商身份提供)有助于交叉编译的功能。因此,您可以使用支持该功能的那个版本的OpenSSL。像openssl = {version =“ 0.10”,features = [“ vendored”]}

答案 1 :(得分:0)

我花了一段时间才找到,但我相信现在有一个简单的 OpenSSL 交叉编译选项 - 启用 vendored feature

这会导致 OpenSSL 作为项目构建的一部分从源代码编译(因此针对与项目其余部分相同的目标架构),而不是期望它已经安装在您的系统上。

您可以将该功能传播到您自己的项目中,以通过向您的 vendored 添加类似的内容来选择性地依赖于 Cargo.toml

[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_ssl 功能将同时编译 OpenSSL。

对于 grpcio,请特别参阅 their documentation,这表明他们为此提供了 openssl-vendored feature。因此,您可以将 grpcio = { version = "0.7", features = ["openssl-vendored"] } 添加到您的 Cargo.toml 以无条件编译 OpenSSL,或使用与上述相同的模式(只是不要将 grpcio 包标记为 optional)。< /p>

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