如何将openssl sys板条箱静态链接到共享库中?

如何将openssl sys板条箱静态链接到共享库中?,openssl,rust,rust-cargo,Openssl,Rust,Rust Cargo,我使用的是一个图书馆,它依赖于你。根据文档,如果我指定OPENSSL\u STATIC=1作为环境变量,那么OPENSSL将静态链接到共享库输出中 由于,我需要将OpenSSL静态链接到我的共享库输出中 这是我的货物。toml: [package] name = "api" version = "0.1.0" authors = ["Naftuli Kay <me@naftuli.wtf>"] publish = false [lib] name = "lambda" crate-

我使用的是一个图书馆,它依赖于你。根据文档,如果我指定
OPENSSL\u STATIC=1
作为环境变量,那么OPENSSL将静态链接到共享库输出中

由于,我需要将OpenSSL静态链接到我的共享库输出中

这是我的
货物。toml

[package]
name = "api"
version = "0.1.0"
authors = ["Naftuli Kay <me@naftuli.wtf>"]
publish = false

[lib]
name = "lambda"
crate-type = ["cdylib"]

[dependencies]
chrono = { version = "0.4", features = ["serde"] }
constant_time_eq = "0.1.3"
cpython = { version = "0.1", default-features = false }
crowbar = { version = "0.2", default-features = false }
libc = "0.2.29"
lazy_static = "1.0"
log = "0.4.1"
log4rs = "0.8.0"
openssl-sys = "0.9.27"
parking_lot ="0.5.4"
rand = "0.4.2"
rusoto_core = "0.32.0"
rusoto_kms = "0.32.0"
serde = "1.0.27"
serde-aux = "0.5.2"
serde_derive = "1.0.27"
serde_json = "1.0.9"
serde_qs = "0.3.0"
tokio = "0.1.3"
tokio-reactor = "0.1.0"

[features]
default = ["cpython/python3-sys"]
当我查看我的
liblambda.so
生成时,我仍然看到它与
libssl
链接:

[vagrant@apivagrant]$OPENSSL_STATIC=1货物构建
在0.94秒内完成开发[未优化+调试信息]目标
[vagrant@apivagrant]$ldd target/debug/liblambda.so | grep-i ssl
libssl.so.10=>/lib64/libssl.so.10(0x00007faa5f5bf000)
我似乎已经以各种方式告诉了它,我知道如何将
libssl
静态链接到共享库输出中


我遗漏了什么?

检查openssl sys提供的
build.rs
文件时,我注意到两件事

  • 如果未同时设置
    OPENSSL_LIB_DIR
    OPENSSL_INCLUDE_DIR
    ,则它将尝试通过调用pkg config来检测OPENSSL目录。如果成功了(在我的系统中也是如此),那么它将提前退出,甚至不会考虑
    OPENSSL\u STATIC
    的值

    可以说这是一个bug,但是我发现如果我使用这个命令行:

    OPENSSL\u STATIC=1 OPENSSL\u LIB\u DIR=/usr/lib64 OPENSSL\u INCLUDE\u DIR=/usr/INCLUDE/OPENSSL货物构建
    
    然后它将执行静态链接

  • 在我的Centos 7系统上,仅安装
    openssl-devel
    是不够的。静态库包含在
    opensslstatic
    包中

  • 即使在所有这些之后,它也没有成功构建——有很多未定义的符号引用。在
    build.rs
    中的注释中指出,编译OpenSSL时使用的编译选项可能会影响可用的API组件-我认为这就是链接失败的原因。显然,这在OpenSSL 1.1.0(我的系统有1.0.2)中不是一个问题


    我的建议是从源代码处编译OpenSSL 1.1.0,并与之链接。

    您是否完成了干净的构建和重建?您的输出表明实际上没有编译,否则我们将在输出中看到“编译”。另请参见,其中包含相同的建议。@Shepmaster我已经完成了一个干净的构建。不清楚您在哪里预编译了
    libssl.a
    ,以及您将它放在哪里?不确定像
    openssl dev
    包这样的东西是否包含静态链接的openssl。我正在安装包含静态代码的openssl static。!我应该去看源代码。我在rust openssl上提出了这个问题。
    #[link(name="openssl", kind="static")]
    extern crate openssl_sys;