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

Building Rcpp package with external C library on Windows

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

到目前为止,我已经能够通过提供源 C 文件(从 RcppCAF 包中的 Makevars 获得灵感)在我的 OS X 机器上编译包,并制作动态静态库并link反对它。 Makevars 文件可以在下面的 link

中找到

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

早些时候我link反对系统上的静态库,但现在因为我在编译包时即时制作静态库(libsundials_all.a),我相信不这样做的用户没有在他们的系统上安装 SUNDIALS(至少在 OS X 上)应该也可以使用这个包(我的想法是否正确?)。我已经检查过以这种方式编译的包是否能够集成测试 ODE。此外,当我 运行 a R CMD check (在 RStudio 上使用 Check 选项,使用 --as-cran 选项)时,我获得了成功,即

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

但是,我希望 Windows 上的用户能够使用这个包,即使他们的机器上没有安装 SUNDIALS,我的问题是

  1. 这是否可行或 Windows 用户需要安装日晷?
  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

一些搜索显示 RTools 可能没有 ar,here 但我认为我不清楚我应该做什么来在 [= 上编译这个包75=]。我查看了一些 Makevars.win 个文件,但其中大部分与 Makevars 相似。我觉得我需要做一个 .dll(类似于 libsundials_all.a,但我完全不知道该怎么做。

任何关于如何在 Windows 上编译这个包的建议都将不胜感激!

此外,出于好奇,我经常发现这样的代码(例如,在 rcppgslMakevars.in 中)

GSL_LIBS   = @GSL_LIBS@

我不确定 @GSL_LIBS@ 是什么意思,make 教程也没有这种语法。对此代码的任何解释都会非常有帮助。

谢谢!

是的,可以在包安装期间在 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 进行编译和 link。在您的情况下,所有编译和 linking 都是在安装时完成的,对吗?