使用鸿蒙编译工具链交叉编译 libcurl 精华
本文主要讲述交叉编译第三方库(以 libcurl 为例进行讲解)时遇到的一些问题,以及如何解决这些问题。希望能够对大家有所帮助,避免踩坑。
安装 HarmonyOS Native SDK
这里以 macOS系统为例,描述如何安装 HarmonyOS NativeSDK。
- 下载 macOS版本的 DevEco Studio 并安装,下载地址为:
- 通过 DevEco Studio 的 SDK Manager 下载 HarmonyOS Native SDK
2.1 点击欢迎页中的 Configure(或设置图标)-> Preferences,进入属性配置页面
2.2 点击 Appearance & Behavior -> System Settings -> HarmonyOS SDK 进入 HarmonyOS SDK 页面
2.3 在 SDK Platforms 选项卡中,勾选 Native SDK。注意这里 Native SDK 的版本号为:2.1.1.21,在后面配置环境变量时会用到
2.4 在 SDK Tools 选项卡中,勾选 Toolchains
2.5 点击 OK 按钮
- 配置环境变量
3.1 打开终端工具,执行下述命令,打开 .bash_profile 文件
3.2 输入以下内容
3.3 保存并退出编辑器
3.4 在终端执行以下命令,使环境变量生效
编译 openssl
由于要在 libcurl 支持 SSL/TLS,所以在编译 libcurl 之前需先编译 openssl 库。这里介绍如何使用鸿蒙编译工具链编译 arm 架构的 openssl 静态库。过程如下:
- 下载 openssl 源码
- 解压缩
- 设置交叉编译环境变量
- 切换到 openssl-OpenSSL_1_1_1g 目录,执行 Configure 命令。
- 执行以下命令开始编译 openssl
编译 libcurl
编译 arm 架构的 libcurl 静态库过程如下:
- 下载 libcurl 源码
- 解压缩
- 设置交叉编译环境变量
- 切换到 curl-7.71.1 目录,执行 configure 命令
- 执行以下命令开始编译libcurl
踩过的坑
- 编译 openssl 静态库运行 Configure 命令时,需要指定所使用的编译器模版,例如编译 Android arm 版本时指定的值为:android-arm。但鸿蒙编译工具链并没有在 Configure的支持列表中。通过查看 Configurations/15-android.conf 文件,可以看到编译 Android arm版本时使用的模版为:
所以这里我们使用 linux-armv4。
2. 编译 libcurl 静态库运行 configure 命令时,出现下述错误提示:
原因是鸿蒙编译工具链没有提供独立的pthread 线程库,解决方法是在执行configure命令时,指定 --disable-threaded-resolver 即可。
3. 编译 libcurl静态库执行 make命令时,出现下述错误提示:
原因是在 configure执行过程中,没有检测到可用的socket 函数,导致未定义 HAVE_SOCKET 宏。解决方式是,在 CPPFLAGS 环境变量中加上 --gcc-toolchain 和 --sysroot 的定义。
结语
个人体验是鸿蒙编译工具链还不是很完善,例如:缺少独立的 atomic、gcc 等。希望华为可以尽快补齐这方面的能力,与 NDK 比肩。也希望鸿蒙能够越走越远。
还没遇到,先mark一下。
博主,编译出libcurl后,在dev eco中链接编译,但是报很多库内函数未定义的错,请问有可能是什么原因呀?ld.lld: error: undefined symbol: EVP_sha256
>>> referenced by sha256.c
>>> libcurl_la-sha256.o:(my_sha256_init) in archive D:/1_liutian/5_app/3_native/native/entry/src/main/cpp/lib/libcurl.a
>>> referenced by openssl.c
>>> libcurl_la-openssl.o:(ossl_sha256sum) in archive D:/1_liutian/5_app/3_native/native/entry/src/main/cpp/lib/libcurl.a