我正在使用一个依赖于的库openssl 系统 https://github.com/sfackler/rust-openssl。根据文档,如果我指定OPENSSL_STATIC=1
作为环境变量,OpenSSL 将静态链接到共享库输出中。
Due to 一系列复杂的问题 https://stackoverflow.com/q/49262694/128967,我需要将 OpenSSL 静态链接到我的共享库输出中。
这是我的Cargo.toml
:
[package]
name = "api"
version = "0.1.0"
authors = ["Naftuli Kay <[email protected] /cdn-cgi/l/email-protection>"]
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
进入共享库输出。
我缺少什么?
检查build.rs
在 openssl-sys 提供的文件中,我注意到两件事。
-
如果您没有同时设置两者OPENSSL_LIB_DIR
and 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 并链接到它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)