扩展库源码集成指南
三种集成方式
stdx 有三种源码集成方式:git 源码依赖、本地源码依赖和仓颉中心仓源码依赖。
git 源码依赖
在工程的 cjpm.toml 文件中,新增如下源码依赖配置:
[dependencies]
stdx = { git = "https://gitcode.com/Cangjie/cangjie_stdx.git", branch = "main", output-type = "dynamic" }
在工程的 cjpm.toml 文件所在目录,执行 cjpm update 命令即可同步更新本仓源码。
本地源码依赖
如果不希望通过 git 依赖本仓,开发者可以直接下载本仓库分支的全量源码(包括本仓库的 cjpm.toml 配置文件),然后在工程的 cjpm.toml 文件中添加本地模块依赖。
[dependencies]
stdx = { path = "/path/to/cangjie_stdx", output-type="dynamic"}
完成本地模块依赖添加之后,即可在项目中使用 stdx。
仓颉中心仓源码依赖
如果开发者不希望直接依赖本地源码,也可以通过仓颉中心仓依赖 stdx。
通过仓颉中心仓依赖 stdx 时,需要在工程中添加仓颉中心仓配置文件,并且在 cjpm.toml 文件中添加仓颉中心仓模块依赖。具体请参考仓颉中心仓使用说明
[dependencies]
stdx = { version = "x.y.z", output-type="dynamic"}
完成仓颉中心仓模块依赖添加之后,即可在项目中使用 stdx。
包范围
目前源码依赖集成的 stdx 不包含 aspect_cj 和 syntax,并且在 Windows 平台上没有 fuzz 包。
支持平台
- Linux
- macOs
- Windows
- 交叉编译 OpenHarmony
交叉编译 OpenHarmony
Linux 和 macOS 平台交叉编译 OpenHarmony 需要配置交叉编译工具链的环境变量(非 DevEco Studio 项目),请参考编译 ohos-x86_64、ohos-aarch64 工具链
-
OHOS_TOOLCHAIN_PATH (编译工具链中 Clang/LLVM 编译器的二进制目录, 如 /opt/buildtools/ohos_root/prebuilts/clang/ohos/linux-x86_64/llvm/bin)
-
OHOS_SYSROOT_PATH (OpenHarmony 系统头文件目录,如 /opt/buildtools/ohos_root/out/sdk/obj/third_party/musl/sysroot)
DevEco Studio 自带 OpenHarmony 交叉编译工具链,无需设置上面的环境变量。
交叉编译命令:cjpm build --target aarch64-linux-ohos 或者 cjpm build --target x86_64-linux-ohos
注意:
部分版本 DevEco Studio 可能缺少 openssl 头文件, 构建过程中报错找不到 openssl 头文件,需要准备 openssl 头文件放入 DevEco Studio 的 sysroot 下。
Windows 常见路径如
C:\Program Files\Huawei\DevEco Studio\sdk\default\openharmony\native\sysroot\usr\include\openssl。macOS 常见路径如
/Applications/DevEco-Studio.app/Contents/sdk/default/openharmony/native/sysroot/usr/include/openssl。
依赖
由于 stdx 需要拉取并编译外部开源 C 库,也有涉及 C 互操作的包,目前构建有一些额外依赖(使用 DevEco Studio 除外,DevEco Studio 自带了下面的工具),提前准备好下面的依赖,同时配置好环境变量。
- python: > 3.7
- cmake: >= 3.16.5 且 < 4
- ninja: >1.10
- openssl: >= 3 (需要配置环境变量 OPENSSL_ROOT_DIR,指向 OpenSSL 安装的根目录)
- clang: >= 15.0.4 且 < 16 (Linux or macOS)
- mingw-w64 (Windows) 下载地址
注意事项
- 如果配置的 stdx 编译产物类型为 dynamic,且用户 cjpm 项目的产物为可执行文件,在手动运行可执行文件前,需要将工程目录下的 target/release/stdx 目录添加到 LD_LIBRARY_PATH(Linux)、DYLD_LIBRARY_PATH(macOS)、PATH(Windows) 环境变量中。
- 如果配置的 stdx 编译产物类型为 static,且用户使用了有 FFI 调用的库,则需要在项目的 cjpm.toml 文件的
compile-option中手动添加链接选项。其对应关系如下表:
| 库名 | 链接选项 |
|---|---|
| stdx.compress.tar | -lstdx.compress.tarFFI |
| stdx.compress.zlib | -lstdx.compress.zlibFFI |
| stdx.crypto.keys | -lstdx.crypto.keysFFI -lcangjie-dynamicLoader-opensslFFI |
| stdx.crypto.x509 | -lstdx.crypto.x509FFI -lcangjie-dynamicLoader-opensslFFI |
| stdx.net.tls | -lstdx.net.tlsFFI -lcangjie-dynamicLoader-opensslFFI |
| stdx.encoding.json | -lstdx.encoding.jsonFFI |
| stdx.encoding.json.stream | -lstdx.encoding.json.streamFFI |
| stdx.fuzz | -lstdx.fuzzFFI |
常见问题
- 找不到 OPENSSL:请检查是否配置了环境变量 OPENSSL_ROOT_DIR,并且 OPENSSL_ROOT_DIR/lib 目录下包含 openssl 动态库。
- stdx 编译过程中 zlib 编译失败:首先检查 third_party/zlib 目录下是否包含 zlib 源文件,如果没有则是代码拉取失败,请检查网络连接。如果有请检查 cmake 版本是否符合要求(>= 3.16.5 且 < 4)。
- windows 平台编译时出现 vsnprintf_s 重复定义:请检查 gcc 是否是依赖中的 mingw-w64 提供的。
- 编译时出现 undefined reference to
CJ_XXX:改为依赖 stdx 动态库,或在项目的 cjpm.toml 文件的compile-option中手动添加-lstdx.encoding.jsonFFI -lstdx.encoding.json.streamFFI -lstdx.compress.zlibFFI -lstdx.compress.tarFFI -lstdx.crypto.keysFFI -lstdx.crypto.x509FFI -lstdx.net.tlsFFI -lcangjie-dynamicLoader-opensslFFI。