欢迎加入 开源鸿蒙跨平台开发者社区,与大家一起共建鸿蒙化 C/C++ 三方库生态。
约束和说明
| 项目 | 说明 |
|---|---|
| 环境配置参考 | 仓库内 lycium/doc/ohos_use_sdk/OHOS_SDK-Usage.md、lycium/README.md |
| OHOS SDK | 需 export OHOS_SDK=<SDK 根目录> |
| 目标库上游 | ada-url/ada |
| 本仓库选用版本 | v2.9.2(见下文「版本选型」) |
| 本仓库适配目录 | thirdparty/ada/ |
| 目标架构 | armeabi-v7a、arm64-v8a、x86_64 |
目标库说明
- 概述 :Ada 是符合 WHATWG URL 的解析库,核心 C++ ,并提供 C API (
ada_c.h)。双许可 Apache-2.0 / MIT。 - 版本选型(重要)
- 上游 v3.x 要求 C++20 ,并在实现中大量使用
std::ranges::replace/find_if/all_of/any_of等 Ranges 算法。 - 实测 OHOS NDK 15 自带 libc++ 未完整提供上述
std::ranges::*符号,导致 v3.4.3 等版本在交叉编译阶段批量报错。 - 本适配固定为
pkgver=2.9.2(C++17 ),与上游 发布页 的 2.9.2 一致;待 NDK/libc++ 补齐后再评估升级 3.x。
- 上游 v3.x 要求 C++20 ,并在实现中大量使用
- 依赖 :
depends=();关闭ADA_TESTING/ADA_BENCHMARKS/ADA_TOOLS/ADA_USE_SIMDUTF可避免 CPM 联网拉取 GTest、simdjson、simdutf 等。
适配过程
1. 分析与选型
| 项 | 结论 |
|---|---|
| 编译方式 | CMake |
| patch | ada_ohos_pkg.patch :仅修改 src/CMakeLists.txt ,去掉 -Wfatal-errors |
| 下载 | codeload.github.com + v${pkgver} 标签 |
2. HPKBUILD 元数据(摘录)
bash
pkgname=ada
pkgver=2.9.2
source="https://codeload.github.com/ada-url/ada/tar.gz/refs/tags/v${pkgver}"
builddir=ada-${pkgver}
packagename=ada-${pkgver}.tar.gz
buildtools=cmake
3. prepare / build 要点
prepare:首次在${builddir}内执行patch -p1 -i ada_ohos_pkg.patch(配合.lycium_patched只打一次),再cp -rf到${builddir}-${ARCH}-build。build:cmake "$@",并追加例如:
-DCMAKE_SYSTEM_NAME=Linux、-DBUILD_SHARED_LIBS=ON、-DADA_TESTING=OFF、-DADA_BENCHMARKS=OFF、-DADA_TOOLS=OFF、-DADA_USE_SIMDUTF=OFF、-DCMAKE_CXX_FLAGS=-Wno-error=unused-command-line-argument。
完整内容以仓库thirdparty/ada/HPKBUILD为准。
4. 补丁全文
diff
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -30,5 +30,6 @@
if((CMAKE_CXX_COMPILER_ID STREQUAL "Clang") OR (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang"))
target_compile_options(ada PRIVATE -Winconsistent-missing-override)
endif()
- target_compile_options(ada PRIVATE -Wfatal-errors -Wsign-compare -Wshadow -Wwrite-strings -Wpointer-arith -Winit-self -Wconversion -Wno-sign-conversion)
+ # OHOS/LLVM 交叉编译下 libc++ 等易触发告警,-Wfatal-errors 会导致首条告警即失败
+ target_compile_options(ada PRIVATE -Wsign-compare -Wshadow -Wwrite-strings -Wpointer-arith -Winit-self -Wconversion -Wno-sign-conversion)
endif(MSVC)
5. hnp.json 与 archive()
与模板一致;name/version 与 pkgname/pkgver 对齐(2.9.2)。
6. 构建
bash
export OHOS_SDK=/path/to/ohsdk/linux
cd lycium
./build.sh ada
日志:ada-2.9.2-<ARCH>-lycium_build.log 、ada-public-lycium_build.log。
7. 产物(典型)
lycium/usr/ada/<ARCH>/ 下 lib/libada.so 、include/ada*.h 、lib/pkgconfig/ada.pc 、lib/cmake/ada/。
8. 应用 CMake(C++17)
cmake
set(ADA_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/prebuilt/ada/${OHOS_ARCH}")
target_include_directories(entry PRIVATE "${ADA_ROOT}/include")
target_compile_features(entry PRIVATE cxx_std_17)
target_link_libraries(entry PRIVATE "${ADA_ROOT}/lib/libada.so")
FAQ
-
为何不用上游最新 3.x?
见上文「版本选型」:当前 OHOS libc++ 与 v3.x 的 C++20 Ranges 用法不兼容,除非全量改写上游或升级 SDK。
-
工具链双重嵌套
Could not find toolchain file仅用
cmake "$@",勿手写重复的OHOS_CMAKE_TOOLCHAIN_FILE。 -
C 源码调用
ada_c.h链接失败
libada仍依赖 C++ 运行时,请用clang++链接或按文档带上libc++_shared。