При попытке установить readxl
или haven
в R (обе зависимости tidyverse
) после компиляции я буду получать следующую ошибку, когда установщик запускает тест загрузки:
** testing if installed package can be loaded
Error in dyn.load(file, DLLpath = DLLpath, ...) :
unable to load shared object '<my_lib_Path>/readxl/libs/readxl.so':
<my_lib_path>/readxl/libs/readxl.so: undefined symbol: libiconv
Error loading failed
У меня есть libiconv.so
в локальном пути lib (не для R-пакетов), который включен в LD_LIBRARY_PATH
, и я проверил в своем сеансе R, что Sys.getenv("LD_LIBRARY_PATH")
имеет этот каталог.
Почему загрузчик динамической библиотеки R не может найти этот общий объект? Есть ли другая переменная среды R, которую мне нужно определить, чтобы динамический загрузчик библиотеки в R находил мой локальный путь?
Обратите внимание, что это не проблема с пулом R-библиотеки, а вместо этого для не-R-зависимости, которую имеет пакет R. Если бы я компилировал и связывал код С++, gcc
использовал бы ld
и, следовательно, LD_LIBRARY_PATH
для отслеживания динамических зависимостей. R, похоже, не соблюдает этот довольно распространенный подход, и я не могу найти никакой документации о том, как управлять этими более мелкомасштабными проблемами зависимости.
Дополнительная информация
!> sessionInfo()
R version 3.3.3 (2017-03-06)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: CentOS Linux 7 (Core)
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
>
Я ранее компилировал libiconv
, потому что это была зависимость для чего-то еще (не помните, что теперь - скорее всего, не R-пакет, учитывая текущие проблемы). Я попытался переустановить его, но не имел никакого значения.
Изменить
Я также попытался вручную загрузить библиотеку до установки:
> dyn.load(".local/lib/libiconv.so")
> is.loaded("libiconv")
[1] TRUE
> install.packages("tidyverse")
но это не так, как указано выше.