【问题标题】:Building Rcpp package with external C library on Windows在 Windows 上使用外部 C 库构建 Rcpp 包
【发布时间】:2018-03-11 22:07:37
【问题描述】:

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

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

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

之前我链接到系统上的静态库,但现在因为我在编译包时动态创建静态库 (libsundials_all.a),我相信没有在他们的系统上安装 SUNDIALS 的用户(在至少OS X) 也应该能够使用这个包(我的想法是正确的吗?)。我已经检查过以这种方式编译的包是否能够集成测试 ODE。此外,当我运行 R CMD check(在 RStudio 上使用 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

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

任何关于如何在 Windows 上编译此软件包的建议将不胜感激!

另外,出于好奇,我经常会找到这样的代码(例如,在 Makevars.inrcppgsl 中)

GSL_LIBS   = @GSL_LIBS@

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

谢谢!

【问题讨论】:

  • 试试this post。这是一个 CRAN-Windows 约定。
  • 谢谢德克。我会看看你提到的链接。
  • 抱歉,使用 环境变量 GSL_LIBS 是 windows 的惯例。使用@GSL_LIBS 指定autoconf,即该值将由configure 脚本填充(在Linux、Unix、macOS 上...)。我也在几个地方解释过;你可以只关注 RcppGSL 包,或者更简单的,使用 RcppGSL 的其他包——例如我的小 RcppZiggurat。

标签: rcpp r-package


【解决方案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。在您的情况下,所有编译和链接都是在安装时完成的,对吗?

【讨论】:

  • RcppGSL 在所有操作系统上都使用 external 库。根据旧惯例,CRAN 在 Windows 上也有它,并通过 GSL_LIBS 指向它。
  • @DirkEddelbuettel RcppGSL 还需要一个外部库,否则只有包中定义的少数函数(如fastLm)可用,对吧?
  • 这正是我写的六分钟。 RcppGSL 使用外部在所有平台上 并且从不构建 GSL 本身。这类似于在 CRAN 上使用 GSL 的其他软件包。对于 Windows,它们都依赖于环境变量 GSL_LIBS。
  • 感谢您的帮助!我修改了Makevars.wingithub.com/sn248/Rcppsbmod/blob/master/src/Makevars.win)。我能够在 Windows 上编译包并在 Win Builder 上提交包给出了快乐的消息 - packaged installation of 'Rcppsbmod' as Rcppsbmod_0.1.0.zip * DONE (Rcppsbmod) In R CMD INSTALL。还有一些工作要做 - No examples, no tests, no vignettes * DONE Status: 1 WARNING, 1 NOTE,但那是改天的故事了。感谢 Ralf 和 Dirk 的投入。
  • 关于 GSL_LIBS,我认为这个链接 - (cran.r-project.org/bin/windows/contrib/ThirdPartySoftware.html) 提供了 CRAN 上可用的库列表,可以指向。我对LIB_SBML 可用这一事实感到兴奋,但不确定它是否是使用最新版本的SBML 构建的。我们能否找出可用的底层 C 库版本(如果它是从旧版本构建的,请请求更新)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 2022-01-07
相关资源
最近更新 更多