Rcpp:无法打开共享对象文件

2024-01-11

我正在尝试开发一个 R 包,它利用阵列火 https://github.com/arrayfire/arrayfire,感谢 Rcpp 库。 我已经开始编写示例代码(让我们将其命名为你好世界.cpp)看起来像这样:

#include <arrayfire.h>

// [[Rcpp::export]]
bool test_array_fire(){
    af::randu(1, 4);    
    return true;
}

然后,我尝试使用sourceCpp功能

Rcpp::sourceCpp('src/hello_world.cpp')

我的第一个惊喜是我必须手动设置一些标志(sourceCpp似乎忽略Makevars编译一段 C++ 代码时的配置)。 我用以下方法做到了:

Sys.setenv("PKG_CXXFLAGS"="-std=c++11")
Sys.setenv("PKG_CPPFLAGS"="-I/opt/arrayfire/include/")
Sys.setenv("PKG_LIBS"="-L/opt/arrayfire/lib64/ -laf")

但是,代码仍然无法正确编译。每次试验均以以下输出结束:

Error in 'dyn.load("/tmp/RtmpHaODIU/sourceCpp-x86_64-pc-linux-gnu-1.0.2/sourcecpp_689c5adb8d/sourceCpp_14.so")':
unable to load shared object '/tmp/RtmpHaODIU/sourceCpp-x86_64-pc-linux-gnu-1.0.2/sourcecpp_689c5adb8d/sourceCpp_14.so':
  libaf.so.3: cannot open shared object file: No such file or directory

不幸的是,我找不到解决我的问题的方法(即使某些 Stack Overflow 问题提出的问题乍一看或多或少相似)。

我该如何修复它?


当 R 尝试加载共享对象文件时,该错误发生在该过程的最后阶段。这意味着在您设置的环境变量的帮助下编译和链接可以正常工作。但在最后一步运行时链接器不知道在哪里libaf.so.3位于。这是通常在操作系统级别进行的配置,例如在我的系统上

ralf@barra:~$ /sbin/ldconfig -p | grep libaf
        libafopencl.so.3 (libc6,x86-64) => /lib/libafopencl.so.3
        libafopencl.so (libc6,x86-64) => /lib/libafopencl.so
        libafcpu.so.3 (libc6,x86-64) => /lib/libafcpu.so.3
        libafcpu.so (libc6,x86-64) => /lib/libafcpu.so
        libaf.so.3 (libc6,x86-64) => /lib/libaf.so.3
        libaf.so (libc6,x86-64) => /lib/libaf.so

如果我尝试你的示例,它可以正常使用链接到的共享对象文件libaf:

ralf@barra:~$ ldd /tmp/RtmpcjY9dN/sourceCpp-x86_64-pc-linux-gnu-1.0.2/sourcecpp_13d33790279c/sourceCpp_7.so | grep libaf
        libaf.so.3 => /lib/libaf.so.3 (0x00007f21037ed000)

我希望在您的情况下,第一个命令不会提供任何结果,第二个(调整后的)命令将导致“文件未找到”(?)错误。

有几种方法可以告诉运行时链接器库的位置:

  • Edit /etc/ld.so.conf或者(更好)将文件放入/etc/ld.so.conf.d/, c.f. http://arrayfire.org/docs/installing.htm#Linux http://arrayfire.org/docs/installing.htm#Linux.
  • Set LD_LIBRARY_PATH.
  • Add -Wl,-rpath,/opt/arrayfire/lib64/ to PKG_LIBS
  • 将 ArrayFire 安装到链接器默认搜索的目录中。这就是我正在做的事情,因为我从源代码编译并使用生成的 DEB 包 https://github.com/arrayfire/arrayfire/wiki/Build-Instructions-for-Linux#packaging.

As for Rcpp::sourceCpp不尊重Makevarsfile: 问题是你写的C++文件不能直接使用。相反,Rcpp 属性必须创建额外的包装函数,这是在临时目录中完成的。现在原则上可以复制Makevars文件也进入该目录。然而,人们通常在以下命令的帮助下设置这些变量:Rcpp::plugins and Rcpp::depends属性。例如,C++11 上的切换是使用// [[Rcpp::plugins(cpp11)]]。对于其他变量,您可以编写自己的插件或使用我提供的插件RcppArrayFire https://www.daqana.org/rcpparrayfire/.

但是,如果这是您的目标,我建议您从一个包开始。Rcpp::sourceCpp对于很多事情来说都很棒,但是在没有 R 包帮助的情况下与系统安装的库进行交互并不是其中之一。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rcpp:无法打开共享对象文件 的相关文章

  • 与逻辑语句匹配的 Rcpp 矩阵的子集

    在 R 中 如果我们有一个数据矩阵 比如一个 100 x 10 矩阵 X 以及一个具有可能值 0 1 2 3 的 100 元素向量 t 我们可以使用简单的方法轻松找到 X 的子矩阵 y句法 y X t 1 但是 问题是 我如何使用 Rcpp
  • Rcpp 函数比 Rf_eval 慢

    我一直在开发一个包 它使用 Rcpp 在一组大型医学成像文件上应用任意 R 代码 我注意到我的 Rcpp 实现比原始的纯 C 版本慢得多 我追踪了通过 Function 调用函数与原始 Rf eval 的区别 我的问题是为什么性能会下降近
  • 如何链接到 boost date_time

    Example 我有一个 Rcpp 函数 我想调用它boost posix time time from string 我从以下位置获取了示例代码增强文档 https www boost org doc libs 1 65 0 doc ht
  • 并行化采用外部指针的函数 (XPtr)

    这个问题既不是重复的this one https stackoverflow com questions 37167479也不属于this one https stackoverflow com questions 6074310 这是关于
  • 如何在 Windows 上设置 Eclipse + StatET + Rcpp

    当我知道我可以使用 Rcpp 用 C 创建 R 包时 我感到很兴奋 并渴望了解它的开发环境 并感谢秋季统计博客 http blog fellstat com p 170 我可以使用 Eclipse 和 StatET 它的 R 插件 快速建立
  • 元素矩阵乘法:R 与 Rcpp(如何加速此代码?)

    我是新来的C 编程 使用Rcpp无缝集成到R 并且我希望得到一些有关如何加快某些计算速度的建议 考虑以下示例 testmat lt matrix 1 9 nrow 3 testvec lt 1 3 testmat testvec 1 2 3
  • 如何调整 NumericVector 的大小?

    如何在 Rcpp 中调整大小NumericVector 当我使用push back为此 程序会变慢 但没有 resize or reserve 功能 当我已经有一个NumericVector有了所需的大小 我可以使用复制构造函数来获取正确的
  • R中的快速并行二分距离计算

    使用并行 Rcpp 后端计算 R 中二分距离最快的方法是什么 parallelDist是一个很棒的包 带有 cpp 后端并支持多线程 但不支持二分距离计算 据我所知 Using parallelDist 用于二分距离矩阵计算 除了 m1 m
  • Rcpp 和移动语义

    我实现了一个算法C 返回一个巨大的元素数组作为输出 现在 我想实现一个包装器Rcpp这样我就可以使用调用这个函数R 我在 Makevars 文件中指定了以下设置 PKG CXXFLAGS std c 11 这样我就可以使用C 11版本了 R
  • 在 Windows 上使用与 Rtools 和 Rcpp 附带的不同的 gcc 版本

    在我开始更新 gcc 之前 是否有人真正尝试过这一点 他们能否确认需要从源代码构建 R 来更新用于使用 Rcpp 编译 c 代码的 gcc 版本 即不一定用于包创作 当然也不适用于 CRAN 有效 包 请参阅德克对此问题的回答 以及原发帖者
  • 是否可以在 [win-builder](http://win-builder.r-project.org/) 上构建使用 Rcpp 和 Boost.Thread 的 R 包?

    最近做了一个R包 使用Rcpp来集成R和C C 库 Boost 用于多线程 我想知道我的包是否可以构建在http win builder r project org http win builder r project org 我发现定义了
  • 如何访问 Rcpp::List 中向量的元素

    我很困惑 以下编译并工作正常 include
  • 矩阵列表乘以标量,Rcpp 中不保留维度属性

    我正在使用 Rcpp 来加速一些 R 代码 实际上这是我 2014 年 待办事项 列表中的项目之一 部分代码包括将矩阵列表乘以标量 我能够得到结果 尽管如此 矩阵不再是矩阵 而是向量 我想要一个矩阵列表作为最终输出 这是我到目前为止的代码
  • R 中 %in% 运算符的 C++ 版本

    C 中有没有相当于的函数 in R 中的运算符 考虑 R 中的以下命令 which y in x 我试图在 C 中找到等效的东西 特别是在犰狳中 但我找不到任何东西 然后我编写了自己的函数 与上面的 R 命令相比 它非常慢 这是我写的 in
  • 在 Windows 上从 C++ 调用 R 函数

    我正在尝试在 Windows 上从 C 调用 R 函数 我正在使用 MinGW 来编译程序 但它在编译时抛出错误 代码 取自Dirk 和编译错误如下 include
  • 使累计总和更快

    我正在尝试计算矩阵每一列的累积和 这是我的 R 代码 testMatrix matrix 1 65536 ncol 256 microbenchmark apply testMatrix 2 cumsum times 100L Unit m
  • Rcpp 和 boost:它应该可以工作,但不能

    我对在以下位置找到的有趣帖子有疑问 具有四精度计算的 Rcpp https stackoverflow com questions 42262963 rcpp with quad precision computation I use Rc
  • 相当于 Rcpp 中的 'which' 函数

    我是 C 和 Rcpp 的新手 假设我有一个向量 t1 lt c 1 2 NA NA 3 4 1 NA 5 我想获得 t1 的元素索引NA 我可以写 NumericVector retIdxNA NumericVector x Step 1
  • R、Rcpp 与 Armadillo 中矩阵 rowSums() 与 colSums() 的效率

    背景 来自 R 编程 我正在扩展到 C C 形式的编译代码Rcpp 作为循环交换 以及一般的 C C 效果的实践练习 我实现了 R 的等效项rowSums and colSums 矩阵的函数Rcpp 我知道它们以 Rcpp 糖的形式存在 并
  • 在 RcppArmadillo 中将列向量乘以数值标量

    我在编译这个简单的程序时遇到一些麻烦c 代码使用Rcpp和RcppArmadillo包裹 采用以下简单示例 将矩阵的每一列乘以数值标量 code lt arma mat out Rcpp as

随机推荐

  • Azure CLI aks install cli 权限被拒绝并且 sudo 不起作用

    我正在尝试奔跑az aks install cli但我收到一条错误消息 Downloading client to usr local bin kubectl from https storage googleapis com kubern
  • 正则表达式:捕获捕获组内的捕获组

    Intro 您可以跳至如果什么 如果您对介绍感到厌倦 这个问题并不是特别针对VBScript 我只是在这种情况下使用它 我想找到一个用于一般正则表达式使用 包括编辑器 的解决方案 当我想创作一个改编版时 这一切就开始了示例 4 其中使用 3
  • Django:自定义序列化选项?

    我正在开发一个基于 Django 的 Web 服务 并且正在尝试找出进行序列化的最佳方法 然而 棘手的要求是我希望对响应的格式和包含的字段有几乎完全的控制 例如 Django 序列化器 不幸的是 它包括wadofstuff 序列化器 htt
  • 未定义的方法“空白?”对于“123”:字符串(NoMethodError)

    当我检查 ruby 中的类变量时 我收到这个奇怪的错误 未定义的方法 空白 对于 123 字符串 NoMethodError 我所做的就是Employee set id blank 有什么想法为什么会发生这种情况吗 Thanks The b
  • 如何从 std::integer_sequence 初始化静态数组?

    我为枚举制作了一个符合以下规则的可迭代生成器 Enum 是一个整数序列 没有间隙 给定枚举的最后一个元素不是实际的枚举元素 该类看起来像这样 template
  • 使用 Spark 安全查询。带参数的sql查询表示法

    这个问题是指构建 pyspark 作业来处理大型数据集 Spark提供了多种查询方式 函数表示法和 SQL 表示法 这个问题仅限于 Spark SQL 符号 模式 一个常见的模式是 df spark sql f select from so
  • docker-compose up 和标准输入上的用户输入

    有人可以解释 也许给出解决方法 docker compose 的以下行为吗 给定以下文件 Dockerfile FROM alpine 3 8 COPY entrypoint sh entrypoint sh ENTRYPOINT entr
  • 转发初始值设定项列表表达式

    初始化列表表达式对于初始化 C 容器来说非常方便 std vector
  • 在 Django 中使用数据库视图

    我看到了问题我可以在 django 中使用数据库视图作为模型吗 https stackoverflow com questions 507795 can i use a database view as a model in django并
  • 在WKWebView中加载html文本

    我用这个代码来加载我的html包含文本的文件WKWebView do guard let filePath Bundle main path forResource readBookNumber ofType html else print
  • 选中时更改复选框标签的颜色

    我试图在选中复选框时更改其标签的颜色 我之前在其他网站上做过此操作 但由于某种原因 我的代码无法在这个网站上运行 我正在使用 Drupal 7 和 bootstrap 3 我的复选框如下所示 div class checkbox div
  • 检测 JPG 图像的文件结尾

    我通过 TCP 连续地将许多图像从我的服务器发送到客户端 现在在客户端 我应该如何有效地检测到这是一个图像的结尾 以便我可以将其保存到文件系统 然后处理下一个图像等等 嗯 不能保证您不会在 jpeg 图像中找到 FFD9 找到 jpeg 图
  • RestSharp 单元测试 NUnit Moq RestResponse 空引用异常

    我在尝试将 Moq 与 RestSharp 结合使用时遇到一些挑战 也许这是我对 Moq 的误解 但由于某种原因 我在尝试模拟 RestResponse 时不断收到空引用异常 这是我的单元测试 Test public void GetAll
  • AWS Cognito 用户池如何防御暴力攻击

    我将使用 AWS Cognito 用户池产品作为应用程序的用户目录 但有几个问题 Amazon 是否向 Cognito 用户池发出限制请求 如果是 限制调用的速率限制是多少 Cognito 如何防御登录名 密码的暴力攻击 经过几个小时的搜索
  • 生成maven项目继承/聚合图

    任何人都知道是否可以轻松生成 Maven 项目继承 聚合图 如下面的链接中所示 http sonatype com books maven book reference figs web pom real multi png http so
  • 使用 Google Analytics 进行 Vuejs 事件跟踪

    我希望跟踪按钮和链接上的谷歌分析事件 通常在 jquery 中 我会传递数据属性中的值并获取它们并调用所需的函数 我知道我不应该使用数据属性 所以我正在寻找执行此操作的最佳方法 可以有多个按钮使用不同的数据用途 属性 执行不同的跟踪 所以我
  • 加入条件查询给出错误“无法找到属性”

    我有两张表 Student 和 Courses 我必须连接两个表并获取特定字段 class Student extends Parent Long id Cache usage CacheConcurrencyStrategy READ W
  • char[] 和 char* 之间的区别? [复制]

    这个问题在这里已经有答案了 可能的重复 C char var 和 char var 之间的区别 https stackoverflow com questions 1880573 c difference between char var
  • 运行我的第一个 java 应用程序时出现 InvalidModuleDescriptorException

    我已经开始学习 Java 并在尝试运行我的第一个程序时遇到了问题 如下所示 public class HelloWorld public static void main String args TODO Auto generated me
  • Rcpp:无法打开共享对象文件

    我正在尝试开发一个 R 包 它利用阵列火 https github com arrayfire arrayfire 感谢 Rcpp 库 我已经开始编写示例代码 让我们将其命名为你好世界 cpp 看起来像这样 include