CentOS本地编译R 3.4.4遇PCRE未定义引用错误的原因咨询
分析与解决:R 3.4.x编译时PCRE未定义引用错误
我之前碰到过好几个类似的编译问题,结合你的情况来看,核心原因是R 3.4.x系列对PCRE库的特性要求和3.3.x不一样,再加上你没有管理员权限,系统自带的PCRE可能不符合R的编译要求。具体分析和解决步骤如下:
可能的原因
- R版本对PCRE的依赖升级:R 3.4.x开始默认启用PCRE的JIT(即时编译)支持,而你系统里的PCRE 8.41很可能在编译时没有开启
--enable-jit选项,导致缺失pcre_jit_stack_alloc这类JIT相关的符号。而R 3.3.2对JIT的依赖不强,即使PCRE没有JIT也能正常编译。 - PCRE路径未正确指定:因为你没有管理员权限,系统的PCRE库可能不是全局可访问的,或者你自己安装了自定义PCRE但R的configure脚本没检测到,导致编译时链接了不完整的PCRE库。
- 链接顺序或参数问题:编译R时可能只链接了PCRE的主库,没有包含必要的辅助库(比如pcreposix),或者链接参数缺失,导致符号无法被找到。
解决步骤(无管理员权限适用)
1. 自行编译带JIT支持的PCRE到本地目录
先下载和系统同版本的PCRE源码(避免兼容性问题),编译到用户自己的目录下:
# 下载PCRE 8.41源码 wget https://ftp.pcre.org/pub/pcre/pcre-8.41.tar.gz tar zxf pcre-8.41.tar.gz cd pcre-8.41 # 配置编译参数,开启JIT和POSIX支持,安装到用户本地目录 ./configure --prefix=$HOME/local/pcre --enable-jit --enable-posix make && make install
2. 重新配置并编译R
指定R使用你刚才编译的本地PCRE库,避免依赖系统不完整的版本:
cd R-3.4.4 # 先清理之前的编译残留 make clean # 配置R的编译参数,指定本地PCRE路径 ./configure --prefix=$HOME/local/R-3.4.4 \ --with-pcre1=$HOME/local/pcre \ --enable-R-shlib # 开始编译 make
3. 额外排查:确认configure检测结果
如果还是报错,查看configure的输出日志,确认是否正确识别了带JIT的PCRE。你需要找到类似这样的输出:
checking for PCRE library version >= 8.20... yes
checking whether PCRE library supports JIT... yes
如果没有显示JIT支持,说明configure没找到本地PCRE,需要先设置环境变量指定头文件和库路径:
export CPPFLAGS="-I$HOME/local/pcre/include" export LDFLAGS="-L$HOME/local/pcre/lib -Wl,-rpath=$HOME/local/pcre/lib" # 然后重新执行configure和make
补充说明
为什么R 3.3.2能正常编译?因为R 3.3.x版本默认不强制要求PCRE的JIT支持,即使系统PCRE没有编译JIT,R也会自动 fallback 到非JIT模式。但从3.4.x开始,R将JIT作为默认启用的特性,所以必须依赖带JIT的PCRE库,否则就会出现链接错误。
内容的提问来源于stack exchange,提问作者sfcheung




