ICU 库 OpenHarmony PC交叉编译故障排除详细记录 📅 发布时间:2026/7/8 0:13:40 👁️ 浏览次数: 目录概述ICU 简介交叉编译挑战问题描述问题分析解决过程问题 1: config/icucross.mk 缺失问题 2: config/icucross.inc 缺失问题 3: 主机构建工具未安装最终解决方案构建脚本关键代码验证和测试总结概述本文档详细记录了将 ICU (International Components for Unicode) 库交叉编译到 OpenHarmony 平台时遇到的各种问题及其解决方案。ICU 是一个功能强大的国际化库支持 Unicode 和全球化但其复杂的构建系统在交叉编译时带来了独特的挑战。ICU 简介ICU (International Components for Unicode) 是 Unicode 联盟维护的一个成熟、可移植的 C/C 和 Java 库提供Unicode 支持完整的 Unicode 标准实现国际化日期、时间、数字、货币格式化文本处理排序、搜索、断行、文本转换字符集转换支持数百种字符编码语言环境数据CLDR (Common Locale Data Repository) 数据ICU 被广泛用于各种操作系统和应用中包括 Android、Chrome、Firefox、IBM 产品等。编译成功截图交叉编译挑战ICU 的构建系统使用 Autotools (autoconf/automake)在交叉编译时面临以下挑战工具依赖ICU 在构建过程中需要运行一些工具如gencnval、genrb等来生成数据文件交叉编译配置需要先构建主机版本的工具然后使用这些工具来构建目标平台版本配置文件生成需要生成config/icucross.mk和config/icucross.inc等交叉编译配置文件问题描述在尝试将 ICU 交叉编译到 OpenHarmony 平台时遇到了以下错误/bin/sh: /Users/jianguo/OpenHarmonyPC/build/code/icu/icu4c/source/../host_build/bin/gencnval: No such file or directory make[1]: *** [out/build/icudt79l/cnvalias.icu] Error 127这个错误表明交叉编译过程需要运行gencnval工具工具应该在host_build/bin/目录中但该目录不存在或工具未安装问题分析ICU 交叉编译流程ICU 的交叉编译需要以下步骤主机构建使用系统编译器构建主机版本的工具生成配置文件生成config/icucross.mk和config/icucross.inc交叉编译使用交叉编译器构建目标平台版本同时使用主机构建的工具问题根源通过分析构建日志和源代码发现以下问题配置文件缺失config/icucross.mk和config/icucross.inc未正确生成工具未安装主机构建的工具没有被安装到host_build/bin/目录路径问题ICU 的工具可能被构建到不同的位置需要正确查找和复制解决过程问题 1: config/icucross.mk 缺失错误信息configure: error: /Users/jianguo/OpenHarmonyPC/build/code/icu/icu4c/source/../host_build/config/icucross.mk not found. Please build ICU in /Users/jianguo/OpenHarmonyPC/build/code/icu/icu4c/source/../host_build first.分析ICU 交叉编译需要config/icucross.mk文件该文件应该在主机构建时生成主机构建检查不完整只检查了Makefile没有检查config/icucross.mk解决方案在主机构建检查中添加config/icucross.mk的检查并显式构建该文件# 检查主机构建是否完成需要 Makefile 和 config/icucross.mkif[!-d${HOST_BUILD_DIR}]||[!-f${HOST_BUILD_DIR}/Makefile]||[!-f${HOST_BUILD_DIR}/config/icucross.mk];then# ... 主机构建逻辑 ...# 构建 config/icucross.mk交叉编译必需makeconfig/icucross.mk||{echoError: Failed to build config/icucross.mkexit1}fi问题 2: config/icucross.inc 缺失错误信息icudefs.mk:303: /Users/jianguo/OpenHarmonyPC/build/code/icu/icu4c/source/../host_build/config/icucross.inc: No such file or directory make: *** No rule to make target /Users/jianguo/OpenHarmonyPC/build/code/icu/icu4c/source/../host_build/config/icucross.inc. Stop.分析除了config/icucross.mk还需要config/icucross.inc该文件也需要在主机构建时显式生成解决方案在主机构建检查中添加config/icucross.inc的检查并显式构建# 检查主机构建是否完成需要 Makefile、config/icucross.mk 和 config/icucross.incif[!-d${HOST_BUILD_DIR}]||[!-f${HOST_BUILD_DIR}/Makefile]||\[!-f${HOST_BUILD_DIR}/config/icucross.mk]||\[!-f${HOST_BUILD_DIR}/config/icucross.inc];then# ... 主机构建逻辑 ...# 构建 config/icucross.mk交叉编译必需makeconfig/icucross.mk||{echoError: Failed to build config/icucross.mkexit1}# 构建 config/icucross.inc交叉编译必需makeconfig/icucross.inc||{echoError: Failed to build config/icucross.incexit1}fi问题 3: 主机构建工具未安装错误信息/bin/sh: /Users/jianguo/OpenHarmonyPC/build/code/icu/icu4c/source/../host_build/bin/gencnval: No such file or directory分析主机构建时工具被编译但没有安装到host_build/bin/目录ICU 的工具可能被构建到不同的位置source/bin/相对于源目录tools/*/各个工具目录中其他位置解决方案实现多路径查找和安装逻辑# 创建 bin 目录ICU 工具会被构建到 bin 目录mkdir-pbin# ICU 的工具在构建后会被链接到 ../../bin/相对于 tools 目录即 source/bin/# 但我们需要将它们复制到 host_build/bin/ 以便交叉编译使用# 首先检查工具是否在源目录的 bin 中if[-d${ICU_SOURCE_DIR}/bin];thenechoCopying tools from${ICU_SOURCE_DIR}/bin to bin/cp-f${ICU_SOURCE_DIR}/bin/* bin/2/dev/null||truefi# 如果工具在 tools/*/ 目录中某些构建配置fortool_dirintools/*/;doif[-d${tool_dir}];thentool_name$(basename${tool_dir})# 检查工具是否在工具目录中if[-f${tool_dir}${tool_name}][-x${tool_dir}${tool_name}];thenechoCopying${tool_name}from${tool_dir}to bin/cp-f${tool_dir}${tool_name}bin/2/dev/null||truefidonedone# 如果工具还没有被复制尝试使用 make install 安装if[!-fbin/gencnval][!-fbin/genrb];thenechoTools not found, trying make install...# 尝试安装工具到当前目录makeinstallDESTDIR$(pwd)prefix2/dev/null||{echomake install failed, trying to find tools...# 查找所有工具可执行文件find.-typef-executable-namegencnval-o-namegenrb-o-namegenccode-o-namegencmn2/dev/null|whilereadtool_path;dotool_name$(basename${tool_path})echoFound${tool_name}at${tool_path}, copying to bin/cp-f${tool_path}bin/${tool_name}2/dev/null||truedone}fi# 验证至少有一个工具被安装if[!-fbin/gencnval][!-fbin/genrb];thenechoError: Tools not found in bin/ after buildechoAvailable files in bin/:ls-labin/2/dev/null||echobin/ directory does not existexit1fi最终解决方案项目信息完整的构建脚本关键部分如下# ICU 交叉编译需要先构建主机版本的工具# 创建主机构建目录HOST_BUILD_DIR${ICU_SOURCE_DIR}/../host_build# 检查主机构建是否完成需要 Makefile、config/icucross.mk 和 config/icucross.incif[!-d${HOST_BUILD_DIR}]||[!-f${HOST_BUILD_DIR}/Makefile]||\[!-f${HOST_BUILD_DIR}/config/icucross.mk]||\[!-f${HOST_BUILD_DIR}/config/icucross.inc];thenechoBuilding host ICU for cross-compilation tools...mkdir-p${HOST_BUILD_DIR}cd${HOST_BUILD_DIR}||{echoError: Failed to create host build directoryexit1}# 保存交叉编译器的环境变量SAVE_CC${CC}SAVE_CXX${CXX}SAVE_CFLAGS${CFLAGS}SAVE_CXXFLAGS${CXXFLAGS}SAVE_LDFLAGS${LDFLAGS}# 使用系统编译器构建主机版本ifcommand-vclang/dev/null21[$(uname)Darwin];thenHOST_CCclangHOST_CXXclangelifcommand-vgcc/dev/null21;thenHOST_CCgccHOST_CXXgelifcommand-vcc/dev/null21;thenHOST_CCccHOST_CXXcelseechoError: No suitable host compiler foundexit1fi# 配置主机版本使用系统编译器不使用交叉编译标志CC${HOST_CC}\CXX${HOST_CXX}\CFLAGS\CXXFLAGS\LDFLAGS\${ICU_SOURCE_DIR}/configure\--enable-static\--disable-shared\--disable-samples\--disable-tests||{echoError: Host configure failedexit1}# 构建工具和配置文件交叉编译需要 icucross.mk# 首先构建 icudefs.mkicucross.mk 的依赖makeicudefs.mk||{echoError: Failed to build icudefs.mkexit1}# 构建 config/icucross.mk交叉编译必需makeconfig/icucross.mk||{echoError: Failed to build config/icucross.mkexit1}# 构建 config/icucross.inc交叉编译必需makeconfig/icucross.inc||{echoError: Failed to build config/icucross.incexit1}# 构建工具make-j$(sysctl-nhw.ncpu2/dev/null||echo4)tools||{echoError: Host build failedexit1}# 创建 bin 目录并安装工具mkdir-pbin# 多路径查找和复制工具if[-d${ICU_SOURCE_DIR}/bin];thenechoCopying tools from${ICU_SOURCE_DIR}/bin to bin/cp-f${ICU_SOURCE_DIR}/bin/* bin/2/dev/null||truefifortool_dirintools/*/;doif[-d${tool_dir}];thentool_name$(basename${tool_dir})if[-f${tool_dir}${tool_name}][-x${tool_dir}${tool_name}];thenechoCopying${tool_name}from${tool_dir}to bin/cp-f${tool_dir}${tool_name}bin/2/dev/null||truefifidone# 如果工具还没有被复制尝试使用 make install 安装if[!-fbin/gencnval][!-fbin/genrb];thenechoTools not found, trying make install...makeinstallDESTDIR$(pwd)prefix2/dev/null||{echomake install failed, trying to find tools...find.-typef-executable-namegencnval-o-namegenrb-o-namegenccode-o-namegencmn2/dev/null|whilereadtool_path;dotool_name$(basename${tool_path})echoFound${tool_name}at${tool_path}, copying to bin/cp-f${tool_path}bin/${tool_name}2/dev/null||truedone}fi# 验证必需文件是否存在if[!-fconfig/icucross.mk];thenechoError: config/icucross.mk not found after buildexit1fiif[!-fconfig/icucross.inc];thenechoError: config/icucross.inc not found after buildexit1fi# 验证至少有一个工具被安装if[!-fbin/gencnval][!-fbin/genrb];thenechoError: Tools not found in bin/ after buildls-labin/2/dev/null||echobin/ directory does not existexit1fiechoHost build tools installed successfully:ls-lhbin/2/dev/null|head-10||echoNo tools foundechoHost ICU build completed successfully# 恢复交叉编译器的环境变量exportCC${SAVE_CC}exportCXX${SAVE_CXX}exportCFLAGS${SAVE_CFLAGS}exportCXXFLAGS${SAVE_CXXFLAGS}exportLDFLAGS${SAVE_LDFLAGS}# 返回到源目录cd${ICU_SOURCE_DIR}||exit1fi构建脚本关键代码移植环境说明该命令基于build配置框架进行移植编译环境搭建可以参考文章《开源软件鸿蒙化适配与构建指南(交叉编译)》主要是ohos sdk的下载配置和build配置框架的下载使用说明。主机构建检查# 检查主机构建是否完成需要 Makefile、config/icucross.mk 和 config/icucross.incif[!-d${HOST_BUILD_DIR}]||[!-f${HOST_BUILD_DIR}/Makefile]||\[!-f${HOST_BUILD_DIR}/config/icucross.mk]||\[!-f${HOST_BUILD_DIR}/config/icucross.inc];then# 执行主机构建fi配置文件生成# 构建 config/icucross.mk交叉编译必需makeconfig/icucross.mk||{echoError: Failed to build config/icucross.mkexit1}# 构建 config/icucross.inc交叉编译必需makeconfig/icucross.inc||{echoError: Failed to build config/icucross.incexit1}工具安装逻辑# 多路径查找和复制工具# 1. 从源目录的 bin 目录复制if[-d${ICU_SOURCE_DIR}/bin];thencp-f${ICU_SOURCE_DIR}/bin/* bin/2/dev/null||truefi# 2. 从各个工具目录复制fortool_dirintools/*/;doif[-d${tool_dir}];thentool_name$(basename${tool_dir})if[-f${tool_dir}${tool_name}][-x${tool_dir}${tool_name}];thencp-f${tool_dir}${tool_name}bin/2/dev/null||truefidonedone# 3. 如果仍未找到使用 find 命令查找if[!-fbin/gencnval][!-fbin/genrb];thenfind.-typef-executable-namegencnval-o-namegenrb...|whilereadtool_path;docp-f${tool_path}bin/$(basename${tool_path})donefi验证和测试构建完成后验证以下内容配置文件存在ls-lahost_build/config/icucross.mkls-lahost_build/config/icucross.inc工具可执行ls-lahost_build/bin/gencnvalls-lahost_build/bin/genrb host_build/bin/gencnval--version交叉编译成功# 检查目标平台的库文件ls-lalib/libicu*.a总结关键要点ICU 交叉编译需要主机构建必须先构建主机版本的工具然后使用这些工具来构建目标平台版本配置文件至关重要config/icucross.mk和config/icucross.inc是交叉编译必需的配置文件必须显式生成工具路径问题ICU 的工具可能被构建到不同的位置需要实现多路径查找逻辑环境变量管理主机构建和交叉编译需要使用不同的编译器需要正确保存和恢复环境变量经验教训仔细阅读错误信息错误信息中包含了问题的关键线索理解构建系统了解 Autotools 和 ICU 的构建流程有助于快速定位问题分步验证每个步骤后验证结果避免问题累积多路径查找当不确定文件位置时实现多路径查找逻辑适用场景本文档的解决方案适用于ICU 库的交叉编译其他使用 Autotools 的项目的交叉编译OpenHarmony 平台的库移植参考资料ICU 官方文档ICU 构建指南Autotools 文档PC代码仓欢迎加入开源鸿蒙PC社区https://harmonypc.csdn.net/
2025年03月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试 本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。 一、单选题(每题 2 分,共 30 分) 第 1 题 在面向对象编程中,类是一种重要的概念。下面关于类的描述中,不正确的是 ( )。 A. 类是一个抽象的概念,用于描述具有相同属… 2026/3/18 17:50:38
【案例:数据倾斜】调度任务20min,倾斜1h21min 1. 问题描述 有任务平时跑20min,今天1h21min,延迟很严重 2.现象描述 排查了application 执行情况,是数据倾斜: stage 14执行耗时1.1h,最大的task处理量: 2.0 GB / 50336205 rows /12.2 GB 昨天最大task&… 2026/3/18 17:50:38
CogVideoX-2b惊艳效果展示:高清连贯动态视频生成实录 CogVideoX-2b惊艳效果展示:高清连贯动态视频生成实录 1. 核心能力概览 CogVideoX-2b是基于智谱AI最新开源模型构建的视频生成工具,专门针对AutoDL环境进行了深度优化。这个工具最大的特点是能够将文字描述直接转换为高质量的视频内容,整个过… 2026/5/17 1:40:34
STM32F215RE与A3910电机驱动方案详解 1. 项目概述:A3910与STM32F215RE的黄金组合在嵌入式系统开发领域,选择合适的驱动芯片和主控MCU往往决定了项目的成败。A3910作为一款高性能电机驱动芯片,搭配基于ARM Cortex-M3内核的STM32F215RE微控制器,能够构建出响应迅速、控制… 2026/7/8 0:10:49
AI大模型应用开发:小白也能抓住的红利风口,收藏这篇入门指南! 文章指出,虽然微软等科技巨头在裁员,但英伟达等公司却在积极扩招AI相关人才,尤其是具身智能、仿真等领域。AI行业正在经历结构性调整,传统岗位被淘汰,而大模型应用开发等新岗位需求旺盛。对于想转行或学习AI的普通人来… 2026/7/8 0:10:49
运动控制系统安全设置对比:ECI3808的3种限位保护与急停逻辑实现 运动控制系统安全机制深度解析:限位保护与急停逻辑的设计哲学在精密制造与自动化领域,运动控制系统的安全设计绝非简单的功能堆砌,而是一套融合了机械工程、电气原理和软件算法的防御体系。当一台数控机床以每分钟数万转的速度运转࿰… 2026/7/8 0:06:48
BetterNCM安装器:高效管理网易云插件的最佳选择 BetterNCM安装器:高效管理网易云插件的最佳选择 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐插件的繁琐安装流程而烦恼吗?BetterNCM安装器是… 2026/7/8 0:02:48
线激光扫描三维成像:5种光条中心线提取算法对比与Python实现 线激光扫描三维成像:5种光条中心线提取算法对比与Python实现在工业检测、逆向工程和三维重建领域,线激光扫描技术因其非接触、高精度和快速采集的特点,已成为获取物体三维形貌的主流方案之一。这项技术的核心环节是从采集的激光条纹图像中精确… 2026/7/7 23:58:47
SQL 数据分析性能对比:窗口函数 vs 子查询 vs 临时表,3方案效率实测 SQL 数据分析性能优化实战:窗口函数 vs 子查询 vs 临时表 在数据分析工作中,SQL查询性能往往是决定工作效率的关键因素。面对复杂的业务场景,如何选择最优的查询方案?本文将深入对比窗口函数、子查询和临时表三种技术方案… 2026/7/7 23:58:47
BetterNCM安装器:高效管理网易云插件的最佳选择 BetterNCM安装器:高效管理网易云插件的最佳选择 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐插件的繁琐安装流程而烦恼吗?BetterNCM安装器是… 2026/7/8 0:02:48
运动控制系统安全设置对比:ECI3808的3种限位保护与急停逻辑实现 运动控制系统安全机制深度解析:限位保护与急停逻辑的设计哲学在精密制造与自动化领域,运动控制系统的安全设计绝非简单的功能堆砌,而是一套融合了机械工程、电气原理和软件算法的防御体系。当一台数控机床以每分钟数万转的速度运转࿰… 2026/7/8 0:06:48
AI大模型应用开发:小白也能抓住的红利风口,收藏这篇入门指南! 文章指出,虽然微软等科技巨头在裁员,但英伟达等公司却在积极扩招AI相关人才,尤其是具身智能、仿真等领域。AI行业正在经历结构性调整,传统岗位被淘汰,而大模型应用开发等新岗位需求旺盛。对于想转行或学习AI的普通人来… 2026/7/8 0:10:49
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/7 11:26:57
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/7 11:26:58