【问题标题】:R and external C library " cannot open shared object file" while LD_LIBRARY_PATH is set设置 LD_LIBRARY_PATH 时,R 和外部 C 库“无法打开共享对象文件”
【发布时间】:2014-07-25 12:27:09
【问题描述】:

我正在为 R 构建一个 C 扩展,这个库也使用 HDF5 库。

我编译了一个动态库(gcc 标志:-fPIC -shared -Wl,-soname,libmy.so -o ../lib/libmy.so 在“lib”目录中:

$ file /path/to/my/lib/libmy.so

/path/to/my/lib/libmy.so: ELF 64-bit LSB shared object, AMD x86-64, version 1 (SYSV), not stripped

LD_LIBRARY_PATH 已设置:

$ echo $LD_LIBRARY_PATH 
/path/to/hdf5/lib:/path/to/my/lib

现在当我想从目录 /path/to/my/src 中加载我的库时

dyn.load("libmy.so")

我收到以下错误:

Error in dyn.load("libmy.so") : 
  unable to load shared object '/path/to/my/src/libmy.so':
  /path/to/my/src/libmy.so: cannot open shared object file: No such file or directory
Execution halted

如果 libmy.so 被移动到我当前的工作目录(我不想要这个)

 mv ../lib/libmy.so ./

该库似乎已加载,但 R 仍然缺少 hdf5 库中的符号:

Error in dyn.load("libmy.so") : 
  unable to load shared object ' /path/to/my/src/libmy.so':
  /path/to/my/src/libmy.so: undefined symbol: H5T_C_S1_g
Execution halted

我也尝试了 load("my.so") 而不是 "libmy.so"。

如何加载我的动态库?

谢谢。

编辑:在 github 上添加了一个示例:https://gist.github.com/lindenb/7cd766cbb37de01f6cce

【问题讨论】:

  • HDF5 库是否在 LD_LIBRARY_PATH 中?
  • 是的,它是$ echo $LD_LIBRARY_PATH path/to/hdf5/lib:/path/to/my/lib
  • 路径是否正确?它应该是绝对的而不是相对的;另外 (a) ldconfig 是永久添加路径的正确方法,并且 (b) 在安装 hdf5 时不应该注意这一点,即重新访问架构的安装说明吗?
  • 是的,这是完整路径,我会修复它。
  • HDF5 使用经典的 .configure --prexif=/path/ 安装在本地文件夹中

标签: c r dynamic-linking


【解决方案1】:

该解决方案由 John McKown 在 R-Help 邮件列表中提供。

我发现 R 中的 dyn.load() 函数确实 使用 dlopen() 如我所料的例行公事。相反,它执行一个 open()。打开() 函数需要一个特定的文件名,包括路径信息,在 命令打开一个文件。它确实 NOT 看起来像 LD_LIBRARY_PATH 环境变量或其他任何东西。

这是我的代码:

load.dynamic.libraries<-function(libnames)
    { 
    for(libname in libnames)
        {
        found_file=libname;
            for(path in unlist(strsplit(Sys.getenv("LD_LIBRARY_PATH"),":",fixed=TRUE))) 
                {
                    try_file <- paste0(path,"/",libname);

                    if( file.exists(try_file) )
                            {

                            found_file = try_file;
                            break;
                            }
                }
            write(paste("Loading :", try_file), stderr())
            dyn.load(found_file);
        }

    }

【讨论】:

    猜你喜欢
    • 2014-06-30
    • 2015-03-23
    • 2011-12-23
    • 2016-05-11
    • 2013-04-21
    • 2013-05-05
    • 2018-12-17
    • 2021-05-01
    • 1970-01-01
    相关资源
    最近更新 更多