我有一些使用 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 代码。
最佳答案
这里有几个问题:
包“foo”能否可靠地链接到包“bar”? “编写 R 扩展”,在第 5.8 节“链接到其他包”的开头说“不,通常不是”,正如 Gabor 在他之前的评论中暗示的那样。
能否将 C 源代码放入包中以构建依赖于另一个库的包:当然可以,CRAN 上的许多包都可以这样做。例如,根据 GSL、JPEG/TIFF 图形库、XML 或……选择一个包示例。您可以研究这些来源。这并非易事,但如果您研究了这些包、编写 R 扩展中的文档以及此处相关问题的其他答案,您应该可以做到。
关于c - 链接到外部 C 库的 R 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12328156/