OSX Mojave下R加载依赖mgcv的包报_libintl_dgettext符号缺失错误
OSX Mojave 环境下 mgcv 依赖类R包加载故障说明
在Mac OS X 10.14.6(Mojave)系统上运行R时,所有依赖mgcv的R包均会触发动态库加载失败故障,复现代码与对应报错如下:
library(Seurat) Error: package or namespace load failed for ‘Seurat’ in dyn.load(file, DLLpath = DLLpath, ...): unable to load shared object '/Users/akh/Documents/R_lib_4/mgcv/libs/mgcv.so': dlopen(/Users/akh/Documents/R_lib_4/mgcv/libs/mgcv.so, 6): Symbol not found: _libintl_dgettext Referenced from: /Users/akh/Documents/R_lib_4/mgcv/libs/mgcv.so Expected in: /usr/local/Cellar/r/4.0.4_1/lib/R/lib/libR.dylib in /Users/akh/Documents/R_lib_4/mgcv/libs/mgcv.so
基础环境与前置排查信息
- 当前R运行版本为4.0.4 (2021-02-15) "Lost Library Book",运行平台为x86_64-apple-darwin18.7.0 (64位)
- 已通过Homebrew安装0.21稳定版gettext,对应动态库
libintl.8.dylib位于/usr/local/Cellar/gettext/0.21/lib路径下,执行brew info gettext的输出详情为:
brew info gettext gettext: stable 0.21 (bottled) GNU internationalization (i18n) and localization (l10n) library https://www.gnu.org/software/gettext/ /usr/local/Cellar/gettext/0.21 (1,959 files, 19MB) * Poured from bottle on 2021-03-18 at 12:03:19 From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/gettext.rb License: GPL-3.0-or-later
故障根因
mgcv包编译阶段完成了与Homebrew安装的gettext库的动态链接,但R运行时的动态库搜索路径未包含gettext的库目录。加载mgcv.so时,系统无法定位到_libintl_dgettext符号的所属库,会顺着默认加载顺序在已加载的libR.dylib中查找该符号,因libR中无对应符号定义,最终触发加载失败。
修复方案
- 临时快速验证方案:加载目标包前手动指定gettext库路径,即可完成正常加载,适合临时排查使用:
Sys.setenv(DYLD_LIBRARY_PATH = "/usr/local/Cellar/gettext/0.21/lib:$DYLD_LIBRARY_PATH") library(Seurat) - 永久生效方案:将动态库路径配置写入R的启动配置文件,重启R后自动加载配置,无需每次手动执行。打开用户目录下的
.Rprofile文件(不存在则新建),添加以下内容:# 解决gettext动态库缺失导致的mgcv包加载报错 Sys.setenv(DYLD_LIBRARY_PATH = paste0("/usr/local/Cellar/gettext/0.21/lib:", Sys.getenv("DYLD_LIBRARY_PATH"))) - 长期稳定方案:卸载现有mgcv包,从源码重新编译安装,编译时显式指定gettext库路径,从根源上解决动态链接路径依赖问题:
remove.packages("mgcv") install.packages("mgcv", configure.args = "--with-gettext=/usr/local/Cellar/gettext/0.21")
内容的提问来源于stack exchange,提问作者akh22
相关产品推荐
相关产品推荐

