【问题标题】:Use (c)igraph in Rcpp directly (i.e., without going through R)直接在 Rcpp 中使用 (c)igraph(即,不经过 R)
【发布时间】:2020-01-11 03:12:27
【问题描述】:

我在 R 中使用 igraph。现在我正在尝试迁移到 Rcpp。 igraph 是用 C 编写的,但可以从 R 调用。现在从 C++ 我想直接调用它。

目前我的 Rcpp C++ 代码调用 R,它再次调用 C。这似乎很愚蠢。相反,我不想直接从我的 Rcpp C++ 代码中调用 C 库。一种方法,似乎是简单地下载 igraph 标头并将其添加到 Rcpp 中:

#include <igraph-0.7.1\include\igraph.h>

但是编译器抱怨它找不到实际的代码(只有头文件):

...
functions.o:functions.cpp:(.text+0x2fd): undefined reference to `igraph_matrix_set'
...

将所有 ipgraph 编译为 Rcpp 依赖项似乎是 difficult,或者至少我找不到关于如何完成此操作的好的文档。

鉴于 igraph 是从 R 调用的,即在我的系统上运行,我怀疑应该有一种方法可以从 C++ 调用它,而无需绕过 R,类似于

// [[Rcpp::depends(igraph)]]

任何指针都将不胜感激。

【问题讨论】:

  • 您的包含路径看起来很可疑,它应该只是 #include &lt;igraph.h&gt;。您可能必须在您的 CMakeLists 或您用来包含标题的任何内容中修复它。
  • 感谢您指出这一点,我将其更改为您的建议,并在 R 中添加了Sys.setenv("PKG_CXXFLAGS"="-I'D:/path/to/folder/igraph-0.7.1/include/'"),它可以作为 bevofer,但不能解决原始问题
  • 查看整个构建脚本可能有助于我们找到您的问题。
  • 你不能在包含路径中使用反斜杠:它的含义不是由 C++ 标准定义的,实际上它在非 Windows 系统上不起作用。这是纳达所说的补充。
  • @nada,没有明确的构建脚本,因为我正在尝试将其设置为使用 Rcpp“开箱即用”运行。所以只有 Rcpp 在后台自动生成的内容。不知道该发布什么以更轻松地定位问题。

标签: c++ r external igraph rcpp


【解决方案1】:

虽然 R 包可以提供其他 R 包可以调用的 C 函数,但 igraph 包不这样做。我看到以下可能性:

  • igraph 包的大厅也在 C 级别提供其功能,最好通过提供补丁。有关详细信息,请参阅 WRE。

  • 链接到系统安装的igraph C 库,即你现在正在做什么。

  • 在你的包中包含igraph C 库。

  • 编写一个仅包含 igraph 库以及 C/C++ API 必要代码的附加包。这在使用 Rcpp 时应该相对简单。

【讨论】:

    猜你喜欢
    • 2018-08-24
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    相关资源
    最近更新 更多