我的项目是用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"]
):
sudo apt-get install libssl-dev
的OpenSSL环境标志(即使我安装了Ubuntu 16.04
)。gRPC_PROTOBUF_PROVIDER is "module" but PROTOBUF_ROOT_DIR is wrong
。答案 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 进行编译的不同方式。