为iOS构建ICU库遇system函数不可用错误,求解决方案
解决iOS交叉编译ICU时
system()函数不可用的问题 问题根源
你遇到的错误核心在于:ICU的pkgdata工具是要在你的Mac主机上运行的构建辅助工具,但你的交叉编译配置却尝试用iOS SDK去编译它——而iOS SDK明确禁用了system()函数,这才导致了报错。
解决方案步骤
1. 先在Mac主机上编译原生pkgdata工具
先单独编译一份能在你本地Mac上运行的pkgdata,完全不需要交叉编译:
# 进入ICU源码根目录 cd ${ICU_SOURCE} # 创建主机专属编译目录 mkdir -p host-build && cd host-build # 配置主机编译(只需要构建pkgdata工具,不需要完整ICU库) ../configure \ --prefix=$(pwd)/install \ --enable-tools=yes \ --enable-static=yes \ --enable-shared=no \ --enable-extras=no \ --enable-tests=no # 编译并安装到本地目录 make -j$(sysctl -n hw.ncpu) make install
完成后,你会在host-build/install/bin路径下拿到可直接运行的pkgdata工具。
2. 修改iOS交叉编译的configure参数
调整你的交叉编译命令,关闭iOS端的工具编译,并指定使用刚才编译好的主机版pkgdata:
sh ${ICU_SOURCE}/configure \ --host=arm-apple-darwin \ --with-cross-build=${PREBUILD_DIR} \ --with-pkgdata=$(pwd)/host-build/install/bin/pkgdata \ --enable-extras=yes \ --enable-tools=no \ # 关键:不要为iOS编译主机工具 --enable-icuio=yes \ --enable-strict=no \ --enable-static \ --enable-shared=no \ --enable-tests=no \ # 可选:iOS测试需要额外配置,先关闭避免其他问题 --disable-renaming \ --enable-samples=no \ --enable-dyload=no \ --with-data-packaging=static
3. 重新执行编译
现在运行make,应该就能避开system()函数的报错,顺利生成你需要的libicudata.a了。
额外说明
- 你原配置里的
--enable-tools=yes是给主机构建用的,iOS平台根本不需要这些工具,所以必须关闭,否则configure会强制为iOS编译工具,再次触发相同错误。 - 如果之后需要编译iOS端的测试程序,再单独针对测试模块做配置(比如指定测试程序的运行环境),建议先确保核心库编译成功后再处理这部分。
内容的提问来源于stack exchange,提问作者Martin Perry
相关产品推荐
相关产品推荐

