ICU 库 OpenHarmony PC交叉编译故障排除详细记录

📅 发布时间:2026/7/8 0:13:40 👁️ 浏览次数:
ICU 库 OpenHarmony PC交叉编译故障排除详细记录
目录概述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/