c - 链接到外部 C 库的 R 包

标签 c r graph linker igraph

我有一些使用 igraph 的 C 代码图书馆。我想在它周围放置一个 R 包装器并将其作为 R 包发送给 CRAN。

igraph CRAN 上已经有一个 R 端口,所以我的 R 包“foo”依赖于 R 的 igraph 是有意义的。由于 foo 使用它自己的依赖于 C igraph 的 C 代码,我如何将我的 C 函数链接到原始 igraph 库?我读到这是在一个名为 Makevars 的文件中完成的,但是链接到外部库非常麻烦。

如果这不可能,是否只复制整个 igraph 源代码并将其全部放入我的/src 目录中是否更好? R igraph 包已经有一个名为 Makevars 的文件,但我不明白所有的 c 文件是如何构建的——通常在我的 Makefile 中我有类似 gcc 的东西(一些 .c 源文件列表)-o,但 Makevar 只包含

PKG_CFLAGS=-DUSING_R -I. -Ics -Iglpk -Iglpk/amd -Iglpk/colamd \
-g -O2 -I/usr/include/libxml2 -g -O2 -I/usr/include/libxml2 -DNDEBUG \
-DPACKAGE_VERSION=\"0.6\" -DINTERNAL_ARPACK \
-DIGRAPH_THREAD_LOCAL=/**/
PKG_CXXFLAGS= -DUSING_R -DIGRAPH_THREAD_LOCAL=/**/ -DNDEBUG
PKG_LIBS=-lxml2 -lz -lpthread -licucore -lm -lgmp  $(FLIBS) $(LAPACK_LIBS) $(BLAS_LIBS)

all: $(SHLIB)

并且没有其他的Makefile。总之,如何将 C 代码放入依赖于另一个 C 库的 R 包中,以及如何编写相应的 Makevars(或 Makefile)来合并 C 函数?

发布了一个较旧的问题 here但似乎只链接到帮助编写你自己的不依赖于任何东西的 C 代码。

最佳答案

这里有几个问题:

  1. 包“foo”能否可靠地链接到包“bar”? “编写 R 扩展”,在第 5.8 节“链接到其他包”的开头说“不,通常不是”,正如 Gabor 在他之前的评论中暗示的那样。

  2. 能否将 C 源代码放入包中以构建依赖于另一个库的包:当然可以,CRAN 上的许多包都可以这样做。例如,根据 GSL、JPEG/TIFF 图形库、XML 或……选择一个包示例。您可以研究这些来源。这并非易事,但如果您研究了这些包、编写 R 扩展中的文档以及此处相关问题的其他答案,您应该可以做到。

关于c - 链接到外部 C 库的 R 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12328156/

相关文章:

R:使用 for 循环遍历 data.table 中的变量名称(并按变量对它们进行分组)

linux - 我应该学习哪种语言?

c - 这两种说法有什么区别?

c 学习者使用 c prime plus 无法让程序运行

r - 不急切评估其潜在输出的矢量化 if_else 或 case_when ?

r - 有分页符时如何将引文准确地放在数字下方?

javascript - jsx图点更新事件

algorithm - 对于树的每个节点,找到最近的祖先节点,使得 val[node] 与 val[ancestor] 互质

c - malloc/free 是 libc 提供的系统调用还是库例程?

c - 仅包含一个结构的 union