我有一些利用igraph库的c代码。我想在它的周围放一个R包装,并把它作为一个R包送给克兰。
igraph已经在cran上有一个r端口,所以我的r包“foo”依赖于r的igraph是有意义的。由于foo使用自己的c代码依赖于c-igraph,我如何将c函数链接到原始的igraph库?我已经读过,这是在一个名为makevars的文件中完成的,但是链接到外部库是非常困难的。
如果这是不可能的,那么最好将整个igraph源代码复制到my/src目录中?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)
而且没有其他生成文件。总之,如何将c代码放入依赖于另一个c库的r包中,以及如何编写相应的makevars(或makefile)来合并c函数?
一个老问题被贴出了here,但似乎只是链接到帮助您编写自己的不依赖任何东西的c代码。
最佳答案
这里有几个问题:
包“foo”能否可靠地链接到包“bar”?在关于“链接到其他包”的第5.8节的开头,写了r扩展,如gabor在之前的评论中所暗示的那样说“不,一般不会”。
C源代码是否可以放入一个包中来构建一个依赖于另一个库的包:当然,是的,而且Cran上的许多包都会这样做。根据GSL、JPEG/TIFF图形库、XML或…你可以研究这些来源。这并不简单,但是如果您研究这些包、编写r扩展的文档以及其他相关问题的答案,您应该会找到答案。
关于c - 链接到外部C库的R包,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12328156/