启用ICU扩展编译链接SQLCipher(SQLite)时出现未定义引用错误
问题原因及解决方法
核心问题
报错中的u_foldCase_74、ucol_strcoll_74等函数带有版本后缀_74,说明SQLCipher编译时引用了带版本命名的ICU函数符号,但链接时使用的是常规无版本后缀的ICU库,或者编译参数缺少匹配ICU版本的宏定义,导致符号无法匹配。
解决步骤
1. 用pkg-config自动获取正确的ICU参数
不要手动编写ICU的编译和链接标志,借助系统pkg-config工具自动生成匹配当前ICU版本的参数,避免版本不匹配问题:
# 清理之前的编译残留 make clean && rm -rf config.cache # 通过pkg-config获取ICU的编译、链接参数 ICU_CFLAGS=$(pkg-config --cflags icu-uc icu-i18n) ICU_LDFLAGS=$(pkg-config --libs icu-uc icu-i18n icuio) # 重新执行configure编译 ./configure --enable-tempstore=yes \ CFLAGS="-O3 -DSQLITE_ENABLE_ICU -DSQLITE_HAS_CODEC -DSQLITE_TEMP_STORE=2 ${ICU_CFLAGS}" \ LDFLAGS="-lcrypto ${ICU_LDFLAGS}" \ CPPFLAGS="-I/usr/include" && make
2. 强制禁用ICU版本后缀(若上述方法无效)
如果系统的ICU库是带版本后缀编译的,可添加-DU_DISABLE_RENAMING=1宏,让SQLCipher调用无版本后缀的ICU函数:
make clean && rm -rf config.cache ./configure --enable-tempstore=yes \ CFLAGS="-O3 -DSQLITE_ENABLE_ICU -DSQLITE_HAS_CODEC -DSQLITE_TEMP_STORE=2 -DU_DISABLE_RENAMING=1" \ LDFLAGS="-lcrypto -licuio -licui18n -licuuc -licudata" \ CPPFLAGS="-I/usr/include" && make
3. 确认ICU版本一致性
检查系统安装的ICU版本:
pkg-config --modversion icu-uc
确保SQLCipher源码对ICU的版本要求和系统安装的ICU版本一致,若版本差异过大,建议安装匹配版本的ICU库后再编译。
内容的提问来源于stack exchange,提问作者Nightcrawler
相关产品推荐
相关产品推荐

