【发布时间】:2016-12-19 15:31:55
【问题描述】:
我正在使用 bazel 为我的 Android 应用程序构建一个原生库。
我想在它上面使用一些 OpenSSL 函数,如下所示:
#include <jni.h>
#include <openssl/aes.h>
...
AES_encrypt(in, out, key);
如何将 openssl 库添加到 bazel build 中?
附属问题:我应该使用哪个存档?
openssl-1.1.0c.tar.gz
openssl-1.0.2j.tar.gz
openssl-1.0.1u.tar.gz
openssl-fips-2.0.13.tar.gz
openssl-fips-ecp-2.0.13.tar.gz
我尝试过的
我已经下载了openssl-1.0.2j 存档。并在我的BUILD 文件中添加了一个cc_library 条目。
cc_library(
name = "openssl",
srcs = glob([
"openssl-1.0.2j/crypto/**/*.h",
"openssl-1.0.2j/crypto/**/*.c"
]),
includes = [
"openssl-1.0.2j",
"openssl-1.0.2j/crypto/",
],
visibility = ["//visibility:public"],
)
我有这个错误:
openssl-1.0.2j/crypto/dh/p512.c:60:24: fatal error: openssl/bn.h: No such file or directory
#include <openssl/bn.h>
但我不明白为什么这段代码试图包含来自openssl 的文件,而它位于openssl-1.0.2j/crypto/ 中
与openssl-1.1.0c
openssl-1.1.0c/include/openssl/e_os2.h:13:34: fatal error: openssl/opensslconf.h: No such file or directory
# include <openssl/opensslconf.h>
即使我运行Configure 命令,也不会生成opensslconf.h 文件。
【问题讨论】:
-
<opensslconf.h>和<bn.h>由 OpenSSL 的Configure脚本创建。它们特定于平台和架构。另见Build Multiarch OpenSSL on OS X。 -
恐怕OpenSSL的构建可能比一个简单的cc_library能表达的更复杂。我刚刚尝试下载1.0.2j,并没有那么简单。我认为发生的事情是 ./config 如果在配置时启用了 bn (不管是什么),则 bn.h 仅由 ./config 生成,默认情况下并非如此,因此您必须手动(?)排除 bn 子-来自 cc_library 中的源的库。您可以使用 -k(即 bazel -k :openssl)构建以查看更多错误 - bn.h 只是问题之一 - 我还看到缺少 rc5.h 和 md2.h。
-
有使用 Bazel 构建 OpenSSL 的构建规则:lbuchy/bazel-openssl、bazelment/trunk。我没有尝试过其中任何一个,但至少这些构建文件对于了解如何构建它很有用。