【问题标题】:R Linux problem loading shared library using dyn.loadR Linux 使用 dyn.load 加载共享库的问题
【发布时间】:2023-03-31 05:52:01
【问题描述】:

R 需要比我的 CentOS 7 提供的更新版本的 HDF5,我尝试通过在“/opt/hdf5-1.12.0”中安装 HDF-Group 的预编译包和 CentOS7 的库存来弥补这一点HDF5 包。

但是任何在 R 中安装包的尝试都会失败:

> sessionInfo()
R version 3.6.0 (2019-04-26)
Platform: x86_64-redhat-linux-gnu (64-bit)
Running under: CentOS Linux 7 (Core)

Matrix products: default
BLAS/LAPACK: /usr/lib64/R/lib/libRblas.so

locale:
 [1] LC_CTYPE=en_US.UTF-8   LC_NUMERIC=C
 [3] LC_TIME=en_US.UTF-8LC_COLLATE=en_US.UTF-8
 [5] LC_MONETARY=en_US.UTF-8LC_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 

loaded via a namespace (and not attached):
[1] compiler_3.6.0

此错误之前的所有步骤都很好,所有路径都正确

深入挖掘,我发现我显然无法动态加载该库,尽管它存在于引用路径中:

> Sys.setenv(LD_LIBRARY_PATH = \
"/usr/lib64/R/lib:/usr/lib/jvm/jre/lib/amd64/server:\
/usr/lib/jvm/jre/lib/amd64:/usr/lib/jvm/java/lib/amd64:\
/usr/java/packages/lib/amd64:/lib:/usr/lib:/opt/hdf5-1.12.0")
> dyn.load('/opt/hdf5-1.12.0/lib/libhdf5_hl.so.200')
Error in dyn.load("/opt/hdf5-1.12.0/lib/libhdf5_hl.so.200") : 
unable to load shared object '/opt/hdf5-1.12.0/lib/libhdf5_hl.so.200':
libhdf5.so.200: cannot open shared object file: No such file or directory

实际上:

[root:  ls /opt/hdf5-1.12.0/lib/libhdf5_hl.so.200
lrwxrwxrwx. root root unconfined_u:object_r:usr_t:s0   /opt/hdf5-1.12.0/lib/libhdf5_hl.so.200 ->; libhdf5_hl.so.200.0.0

[root:  ls /opt/hdf5-1.12.0/lib/libhdf5_hl.so.200.0.0 
-rwxr-xr-x. root root unconfined_u:object_r:usr_t:s0   /opt/hdf5-1.12.0/lib/libhdf5_hl.so.200.0.0

这里是 R 会话信息:

> sessionInfo()
R version 3.6.0 (2019-04-26)
Platform: x86_64-redhat-linux-gnu (64-bit)
Running under: CentOS Linux 7 (Core)

Matrix products: default
BLAS/LAPACK: /usr/lib64/R/lib/libRblas.so

locale:
[1] LC_CTYPE=en_US.UTF-8   LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8LC_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 

loaded via a namespace (and not attached):
[1] compiler_3.6.0

文件系统权限与成功用于存储在 /opt...下的所有其他自定义应用程序完全相同。

root$:  ls -al /opt/hdf5-1.12.0/lib
total 17604
drwxr-xr-x. 2 root root    4096 Jul 25 20:53 .
drwxr-xr-x. 6 root root     104 Jul 25 20:53 ..
-rw-r--r--. 1 root root   83427 Jul 25 20:53 jarhdf5-1.12.0.jar
-rw-r--r--. 1 root root 9119168 Jul 25 20:53 libhdf5.a
-rw-r--r--. 1 root root  958770 Jul 25 20:53 libhdf5_cpp.a
lrwxrwxrwx. 1 root root      22 Jul 25 20:53 libhdf5_cpp.so -> libhdf5_cpp.so.200.0.0
lrwxrwxrwx. 1 root root      22 Jul 25 20:53 libhdf5_cpp.so.200 -> libhdf5_cpp.so.200.0.0
-rwxr-xr-x. 1 root root  534352 Jul 25 20:53 libhdf5_cpp.so.200.0.0
-rw-r--r--. 1 root root  470268 Jul 25 20:53 libhdf5_fortran.a
lrwxrwxrwx. 1 root root      26 Jul 25 20:53 libhdf5_fortran.so -> libhdf5_fortran.so.200.0.0
lrwxrwxrwx. 1 root root      26 Jul 25 20:53 libhdf5_fortran.so.200 -> libhdf5_fortran.so.200.0.0
-rwxr-xr-x. 1 root root  418648 Jul 25 20:53 libhdf5_fortran.so.200.0.0
-rw-r--r--. 1 root root  234954 Jul 25 20:53 libhdf5_hl.a
-rw-r--r--. 1 root root   13574 Jul 25 20:53 libhdf5_hl_cpp.a
lrwxrwxrwx. 1 root root      25 Jul 25 20:53 libhdf5_hl_cpp.so -> libhdf5_hl_cpp.so.200.0.0
lrwxrwxrwx. 1 root root      25 Jul 25 20:53 libhdf5_hl_cpp.so.200 -> libhdf5_hl_cpp.so.200.0.0
-rwxr-xr-x. 1 root root   19760 Jul 25 20:53 libhdf5_hl_cpp.so.200.0.0
lrwxrwxrwx. 1 root root      19 Jul 25 20:53 libhdf5_hl_fortran.a -> libhdf5hl_fortran.a
-rw-r--r--. 1 root root  184756 Jul 25 20:53 libhdf5hl_fortran.a
lrwxrwxrwx. 1 root root      20 Jul 25 20:53 libhdf5_hl_fortran.so -> libhdf5hl_fortran.so
lrwxrwxrwx. 1 root root      28 Jul 25 20:53 libhdf5hl_fortran.so -> libhdf5hl_fortran.so.200.0.0
lrwxrwxrwx. 1 root root      28 Jul 25 20:53 libhdf5hl_fortran.so.200 -> libhdf5hl_fortran.so.200.0.0
-rwxr-xr-x. 1 root root  165800 Jul 25 20:53 libhdf5hl_fortran.so.200.0.0
lrwxrwxrwx. 1 root root      21 Jul 25 20:53 libhdf5_hl.so -> libhdf5_hl.so.200.0.0
lrwxrwxrwx. 1 root root      21 Jul 25 20:53 libhdf5_hl.so.200 -> libhdf5_hl.so.200.0.0
-rwxr-xr-x. 1 root root  157344 Jul 25 20:53 libhdf5_hl.so.200.0.0
-rwxr-xr-x. 1 root root  604720 Jul 25 20:53 libhdf5_java.so
-rw-r--r--. 1 root root    5586 Jul 25 20:53 libhdf5.settings
lrwxrwxrwx. 1 root root      18 Jul 25 20:53 libhdf5.so -> libhdf5.so.200.0.0
lrwxrwxrwx. 1 root root      18 Jul 25 20:53 libhdf5.so.200 -> libhdf5.so.200.0.0
-rwxr-xr-x. 1 root root 4851592 Jul 25 20:53 libhdf5.so.200.0.0
lrwxrwxrwx. 1 root root      14 Jul 25 20:53 libsz.so -> libsz.so.2.0.0
lrwxrwxrwx. 1 root root      14 Jul 25 20:53 libsz.so.2 -> libsz.so.2.0.0
-rwxr-xr-x. 1 root root   50518 Jul 25 20:53 libsz.so.2.0.0
lrwxrwxrwx. 1 root root      13 Jul 25 20:53 libz.so -> libz.so.1.2.5
lrwxrwxrwx. 1 root root      13 Jul 25 20:53 libz.so.1 -> libz.so.1.2.5
-rwxr-xr-x. 1 root root  106903 Jul 25 20:53 libz.so.1.2.5

有人可以给我提示吗?

因为我的想法已经用完了......

【问题讨论】:

  • LD_LIBRARY_PATH 中将/opt/hdf5-1.12.0 替换为/opt/hdf5-1.12.0/lib/ 是否有助于解决问题?
  • 当您尝试加载libhdf5_hl.so.200 时,您是否注意到错误消息提到了文件libhdf5.so.200
  • 你好 Gorka 和 Rui,谢谢你的参与。我什至明确地将 lib 部分添加到过去,但它并没有改变这种情况:我也觉得提到的对象不同,但我明白这是……像级联故障?这两个对象实际上都存在,如清单所示,我添加到我的帖子中。

标签: r shared-libraries centos7 hdf5


【解决方案1】:

我发现预加载库有助于解决问题:

export LD_PRELOAD=/opt/hdf5-1.12.0/lib/libhdf5.so:/opt/hdf5-1.12.0/lib/libhdf5_hl.so

之后,动态加载静默工作:

dyn.load('/opt/hdf5-1.12.0/lib/libhdf5_hl.so.200')

不幸的是,我不明白,为什么 R 似乎无法靠它自己做到这一点......

【讨论】:

    猜你喜欢
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多