在Windows上使用外部C库构建Rcpp包

时间:2018-03-11 22:07:37

标签: rcpp r-package

我正在构建一个包,它提供了来自SUNDIALS ODE求解C库的cvode解算器的包装器。

到目前为止,我已经能够通过提供源C文件(从OS X RcppCAF包中获取灵感)并使静态编译,在我的Makevars计算机上编译包。库中的动态和链接。 Makevars文件可在以下链接中找到

https://github.com/sn248/Rcppsbmod/blob/master/src/Makevars

之前我曾在系统上链接静态库,但现在因为我在编译包时动态创建静态库(libsundials_all.a),我相信他们的系统上没有安装SUNDIALS的用户(至少在OS X)也应该能够使用这个包(我是否正确地思考这个?)。我已经检查了以这种方式编译的包能够集成一个测试ODE。另外,当我在RStudio上运行R CMD check(使用Check选项,并使用--as-cran选项)时,我获得了成功,即

R CMD check results
0 errors | 0 warnings | 0 notes

但是,我希望Windows上的用户能够使用此软件包,即使他们的计算机上没有安装SUNDIALS,我的问题是

  1. 这是可以做的还是Windows用户需要安装SUNDIALS?
  2. 目前我的Makevars.winMakevars相同,所以当我在R WinBuilder上提交我的包时,我收到以下消息(告诉我make无法使用找到ar)。

    make: ar: Command not found make: *** [../inst/libsundials_all.a] Error 127 Warning: running command 'make -f "Makevars.win" -f "D:/RCompile/recent/R-3.4.3/etc/i386/Makeconf" -f "D:/RCompile/recent/R-3.4.3/etc/i386/Makevars.site" -f "D:/RCompile/recent/R-3.4.3/share/make/winshlib.mk" SHLIB_LDFLAGS='$(SHLIB_CXXLDFLAGS)' SHLIB_LD='$(SHLIB_CXXLD)' SHLIB="Rcppsbmod.dll" ' had status 2 ERROR: compilation failed for package 'Rcppsbmod' * removing 'd:/RCompile/CRANguest/R-release/lib/Rcppsbmod' In R CMD INSTALL

  3. 有些搜索显示RTools可能没有arhere,但我不认为我在Windows上编译此软件包应该做些什么。我查看了一些Makevars.win个文件,但大多数文件与Makevars类似。我觉得我需要制作一个.dll(类似于libsundials_all.a,但我不知道该怎么做。

    有关如何在Windows上编译此软件包的任何建议都将非常感谢!

    另外,为了我的好奇心,我经常会找到这样的代码(例如Makevars.in rcppgsl}

    GSL_LIBS   = @GSL_LIBS@
    

    我不确定@GSL_LIBS@的含义是什么,make教程也没有这种语法。对此代码的任何解释都将非常有用。

    谢谢!

1 个答案:

答案 0 :(得分:1)

是的,可以在程序包安装期间在Windows上构建静态库。我在实验windows branch of dqmagic中这样做:

PKG_CPPFLAGS = -I./libmagic -I./libgnurx -DHAVE_CONFIG_H
PKG_LIBS = -L. -lmagic -lregex -lshlwapi

all: $(SHLIB)
$(SHLIB): libmagic.a libregex.a

LIBMAGIC =libmagic/apprentice.o \ 
[... many object files ...]
libmagic.a: $(LIBMAGIC)

LIBREGEX = libgnurx/regex.o
libregex.a: $(LIBREGEX)

请注意,我没有告诉make如何构建静态库,将其留给自动规则。这样就没有ar丢失的问题。请注意,Linux / Mac OSX版本使用系统安装的库。

我认为RcppGSL在您的情况下不是一个很好的比较,因为它在所有平台上使用外部库。原因是使用此包时,必须能够在包安装后编译并链接GSL 。在您的情况下,所有编译和链接都是在安装时完成的,对吧?