我使用的库依赖于openssl-sys。根据文档,如果我将OPENSSL_STATIC=1
指定为环境变量,OpenSSL将静态链接到共享库输出。
由于a host of complicated problems,我需要将OpenSSL静态链接到我的共享库输出中。
这是我的Cargo.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"]
这是我的lib.rs
:
#[link(name="openssl", kind="static")]
extern crate openssl_sys;
当我查看我生成的liblambda.so
时,我仍然看到它与libssl
相关联:
[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
静态链接到共享库输出中。
我错过了什么?
答案 0 :(得分:3)
检查openssl-sys提供的build.rs
文件,我发现了两件事。
如果您未同时设置OPENSSL_LIB_DIR
和OPENSSL_INCLUDE_DIR
,则会尝试通过调用pkg-config来检测OpenSSL目录。如果成功(并且它在我的系统中),那么它将提前退出,甚至从不考虑OPENSSL_STATIC
的值。
可以说这是一个错误,但我发现如果我使用这个命令行:
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并对其进行链接。