在 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,我的问题是
- 这是否可行或 Windows 用户需要安装日晷?
目前我的 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 但我认为我不清楚我应该做什么来在 [= 上编译这个包75=]。我查看了一些 Makevars.win
个文件,但其中大部分与 Makevars
相似。我觉得我需要做一个 .dll
(类似于 libsundials_all.a
,但我完全不知道该怎么做。
任何关于如何在 Windows 上编译这个包的建议都将不胜感激!
此外,出于好奇,我经常发现这样的代码(例如,在 rcppgsl
的 Makevars.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 都是在安装时完成的,对吗?
我正在构建一个包,其中提供了来自 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,我的问题是
- 这是否可行或 Windows 用户需要安装日晷?
目前我的
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 但我认为我不清楚我应该做什么来在 [= 上编译这个包75=]。我查看了一些 Makevars.win
个文件,但其中大部分与 Makevars
相似。我觉得我需要做一个 .dll
(类似于 libsundials_all.a
,但我完全不知道该怎么做。
任何关于如何在 Windows 上编译这个包的建议都将不胜感激!
此外,出于好奇,我经常发现这样的代码(例如,在 rcppgsl
的 Makevars.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 都是在安装时完成的,对吗?