R包链接到外部C库

JCW*_*ong 16 c linker r graph igraph

我有一些利用igraph库的c代码.我想在它周围放一个R包装并将其作为R包发送给CRAN.

igraph在CRAN上已经有一个R端口,所以我的R包'foo'依赖于R的igraph是有意义的.由于foo使用自己的C代码依赖于C igraph,我如何将我的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)
Run Code Online (Sandbox Code Playgroud)

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

这里发布一个较旧的问题,但似乎只是链接到帮助编写自己的C代码,而不依赖于任何东西.

Dir*_*tel 6

这里有几个问题:

  1. 包'foo'可以可靠地链接到包'bar'吗?"编写R扩展",在第5.8节开头的"链接到其他软件包"中说"不,不是一般",正如Gabor在他早先的评论中暗示的那样.

  2. C源代码可以放入一个包来构建一个依赖于另一个库的包:是的,当然,CRAN上有很多包可以做到这一点.选择例如根据GSL,JPEG/TIFF图形库或XML或...的包的示例.您可以研究这些来源.这不是一件容易的事,但是如果你研究这些软件包,写下R扩展中的文档以及其他相关问题的答案,你就应该到达那里.


Mar*_*gan 5

我对"编写R扩展"的阅读略有不同.第5.8.1节(处理类似unix的操作系统)的第1段说可能但不可移植或建议链接到共享库.第2段说静态库是可以的(该段末尾的"This"令人困惑;它指的是什么?)因为packA提供的静态库可以在安装packB时由packB发现,然后合并到动态库.这要求packA提供一个静态库,因此packA意识到它的作用就是这样做; 许多软件包会将其角色视为为其包装的库的功能子集提供R接口,并提供链接到其自己的软件包中的共享库的共享对象.

一个例子是Bioconductor中的Rsamtools包,它创建了samtools库的静态版本,并为想要访问静态库的包提供了一种(难以获得的)机制(一个插图提供了依赖的包视图).提供静态库的绝对路径非常重要,PKG_LIBS="-l$(PKGB_PATH)/libpackB.a"以避免静态链接到系统提供的同一个库(使用packA提供的头文件).

@DirkEddelbuettel几乎肯定会自己走下这条路,并指出我的错误.我同意下面的评论,即使用静态库是次优的(主要是从内存消耗的角度来看?),但要做出选择以避免第5.8.1段中提到的可移植性原因.