CentOS6.9下源码编译R3.6.0时libicu链接报错的参数配置问题
解决CentOS 6.9编译R 3.6.0的ICU链接错误问题
问题根源
你遇到的undefined reference错误里的ucol_strcollIter_58等函数,都是ICU(International Components for Unicode)库的版本化符号(后缀_58对应ICU 58.x版本)。R 3.6.0依赖ICU来处理Unicode字符排序等功能,但你的configure命令里完全没包含ICU的头文件路径、库路径,也没指定要链接ICU的库文件,导致链接阶段找不到这些函数定义。
具体解决方案
1. 确认ICU的安装路径
如果是你自己编译的ICU 58.x,找到它的安装根目录(比如/path/icu-58.2);如果用系统自带的ICU,先安装devel包:
yum install libicu-devel
系统自带的ICU头文件通常在/usr/include,库文件在/usr/lib64。
2. 修改configure命令,添加ICU相关配置
把ICU的头文件路径加入CPPFLAGS,库路径、链接参数加入LDFLAGS。以下是修改后的完整命令(替换/path/icu-58.x为你的实际ICU路径):
./configure --prefix=/pathto/R_3.6.0 --enable-R-shlib \ CPPFLAGS="-I/usr/include -I/path/zlib_1.2.11/include -I/path/bzip2-1.0.6/include -I/path/xz-5.2.4/include -I/path/pcre-8.43/include -I/path/icu-58.x/include" \ LDFLAGS="-L/usr/lib -L/usr/lib64 -L/path/zlib_1.2.11/lib -L/path/bzip2-1.0.6/lib -L/path/xz-5.2.4/lib -L/path/pcre-8.43/lib -L/path/icu-58.x/lib \ -Wl,-rpath=/path/pcre-8.43/lib -Wl,-rpath=/path/xz-5.2.4/lib -Wl,-rpath=/path/icu-58.x/lib \ -licui18n -licuuc -licudata"
关键新增项说明:
-I/path/icu-58.x/include:告诉编译器去哪里找ICU的头文件-L/path/icu-58.x/lib:告诉链接器去哪里找ICU的库文件-Wl,-rpath=/path/icu-58.x/lib:让编译后的R程序运行时能找到ICU库-licui18n -licuuc -licudata:明确指定要链接ICU的三个核心库
3. 清理旧编译文件,重新编译
先清理之前的configure和make生成的文件,避免残留问题:
make clean && make distclean
然后重新执行修改后的configure,再运行make和make install。
验证配置是否生效
执行configure后,查看输出日志,找到类似以下的行,确认ICU被正确检测到:
checking for ICU... yes
checking for ucol_open in -licuuc... yes
如果显示no,说明ICU路径配置有误,需要检查路径是否正确,或者ICU版本是否匹配(R 3.6.0建议用ICU 58.x或兼容版本)。
内容的提问来源于stack exchange,提问作者Ren
相关产品推荐
相关产品推荐

