关于rust:如何将openssl-sys板条箱静态链接到共享库中?

How do I statically link the openssl-sys crate into a shared library?

我正在使用依赖于openssl-sys的库。根据文档,如果我将OPENSSL_STATIC=1指定为环境变量,则OpenSSL将静态链接到共享库输出中。

由于一系列复杂的问题,我需要将OpenSSL静态链接到共享库输出中。

这是我的Cargo.toml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[package]
name ="api"
version ="0.1.0"
authors = ["Naftuli Kay <[email protected]>"]
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"]

这是我的lib.rs

1
2
#[link(name="openssl", kind="static")]
extern crate openssl_sys;

当我查看生成的liblambda.so时,仍然看到它与libssl链接:

1
2
3
4
[vagrant@api vagrant]$ OPENSSL_STATIC=1 cargo build
    Finished dev [unoptimized + debuginfo] target(s) in 0.94 secs
[vagrant@api vagrant]$ ldd target/debug/liblambda.so | grep -i ssl
        libssl.so.10 => /lib64/libssl.so.10 (0x00007faa5f5bf000)

我似乎已经以各种方式告诉了我,我知道如何将libssl静态链接到共享库输出中。

我想念什么?


检查openssl-sys随附的build.rs文件,我注意到两件事。

  • 如果未同时设置OPENSSL_LIB_DIROPENSSL_INCLUDE_DIR,则它将通过调用pkg-config尝试检测OpenSSL目录。如果成功(并且在我的系统中成功),则它将提早退出,甚至不会考虑OPENSSL_STATIC的值。

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

    1
    OPENSSL_STATIC=1 OPENSSL_LIB_DIR=/usr/lib64 OPENSSL_INCLUDE_DIR=/usr/include/openssl cargo build

    然后它将执行静态链接。

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

  • 即使如此,它仍然无法成功构建-存在许多未定义的符号引用。在build.rs的注释中,它指出在编译OpenSSL时使用的编译选项可能会影响可用的API组件-我认为这是链接失败的原因。显然,这与OpenSSL 1.1.0无关紧要(我的系统具有1.0.2)。

    我的建议是从源代码编译OpenSSL 1.1.0并针对该链接进行链接。