我正在构建一个包,它提供了来自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,我的问题是
目前我的Makevars.win
与Makevars
相同,所以当我在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.in
rcppgsl
}
GSL_LIBS = @GSL_LIBS@
我不确定@GSL_LIBS@
的含义是什么,make
教程也没有这种语法。对此代码的任何解释都将非常有用。
谢谢!
答案 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 。在您的情况下,所有编译和链接都是在安装时完成的,对吧?