Fedora36源码编译R遇linuxbrew gcc GLIBCXX_3.4.30报错解决方法
问题复现操作
升级Fedora至36版本后,参照RStudio官方的R源码安装指引,从源码编译R 4.2.0版本,执行命令如下:
wget https://cran.r-project.org/src/base/R-4/R-4.2.0.tar.gz tar -xzvf R-4.2.0.tar.gz mkdir R42 cd R-4.2.0 ./configure --prefix=/home/andrespara/R42 --enable-memory-profiling --enable-R-shlib --with-blas --with-lapack make
报错核心原因
执行make编译过程中报错退出,核心错误信息:
/home/linuxbrew/.linuxbrew/Cellar/gcc/11.3.0_1/lib/gcc/11/libstdc++.so.6 缺少系统库 /lib64/libicuuc.so.69 依赖的
GLIBCXX_3.4.30版本符号
执行brew linkage gcc排查确认:linuxbrew安装的gcc会优先链接自身携带的libstdc++.so.6库,而非系统版本的对应库,链接输出同时包含系统基础库路径,以及linuxbrew安装的gmp、isl、mpfr等依赖库路径。
已尝试无效的操作
- 执行
brew reinstall srt - 执行
brew doctor - 重装linuxbrew版本gcc
- 执行
brew update、brew upgrade
以上操作均无法解决问题。当前已知强制卸载linuxbrew版gcc(执行brew uninstall --ignore-dependencies gcc)后重新编译可成功安装R,但需要在保留linuxbrew版gcc的前提下解决报错。
可行解决方案
报错本质是linuxbrew会将自身库路径前置到系统动态链接搜索路径最前面,导致编译时加载的brew版libstdc++版本低于Fedora 36系统自带的libicu依赖的版本,无需卸载linuxbrew版gcc,通过以下任意一种方式调整链接优先级即可:
- 临时调整环境变量(推荐)
编译R前,先执行命令将系统库路径放到动态链接搜索路径的最高优先级:
再重新执行configure和make流程即可。如果要避免后续运行R时出现链接问题,可以在configure阶段追加参数固化rpath:export LD_LIBRARY_PATH=/usr/lib64:$LD_LIBRARY_PATH./configure --prefix=/home/andrespara/R42 --enable-memory-profiling --enable-R-shlib --with-blas --with-lapack LDFLAGS="-L/usr/lib64 -Wl,-rpath=/usr/lib64" - 临时隔离brew环境
编译R前执行unset HOMEBREW_PREFIX,临时清除当前终端下linuxbrew的路径配置,让编译过程直接调用系统gcc、链接系统库,编译完成后关闭当前终端重新打开,即可恢复linuxbrew的正常使用。
操作前可做前置校验:执行strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX_3.4.30,如果命令返回匹配结果,说明系统自带libstdc++确实包含所需符号,上述方案均可生效。
内容的提问来源于stack exchange,提问作者Andrés Parada

