【问题标题】:How to cross compile a rust project with openssl?如何使用 openssl 交叉编译 rust 项目?
【发布时间】:2019-07-13 11:28:15
【问题描述】:

我的项目是用 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. 找不到用于 Ubuntu 16.04 的 OpenSSL 的一些环境标志(即使我安装了 sudo apt-get install libssl-dev)。
  2. gRPC_PROTOBUF_PROVIDER is "module" but PROTOBUF_ROOT_DIR is wrong

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

【问题讨论】:

  • 只是添加我的评论,需要对此有更好的解决方案

标签: rust cross-compiling grpc


【解决方案1】:

您不能使用 Openssl 的所有功能交叉编译您的 rust 程序,因为某些版本的 OpenSSL 不支持(作为供应商的功能),这有助于交叉编译。因此,您可以使用支持此功能的 OpenSSL 版本。比如 openssl = { version = "0.10", features = ["vendred"] }

【讨论】:

    【解决方案2】:

    我花了一段时间才找到,但我相信现在有一个简单的 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)。

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

    【讨论】:

      【解决方案3】:

      在尝试编译到 Turris Omnia 路由器 (armv71) 时,我正在寻找类似的问题。我找到了一个很棒的 docker 镜像来解决我的问题。

      看看:https://github.com/messense/rust-musl-cross

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-10
        • 2023-02-02
        • 1970-01-01
        • 2013-12-09
        • 1970-01-01
        • 2012-10-15
        • 2015-03-28
        • 1970-01-01
        相关资源
        最近更新 更多