2014-11-24 64 views
0

我正在构建一个R包,其中有几个使用GSL和OpenMP的第三方C函数,然后使用Rcpp (它只是修改一些参数并调用相应的C函数)。在我的Windows机器中一切正常,但我不知道如何以便携的方式定义Makevars.win和Makevars文件。我的Makevars.win看起来像这样:使用C,GSL和OpenMP的便携式Makevars在Rcpp的帮助下使用C,GSL和OpenMP

## This assumes that the LIB_GSL variable points to working GSL libraries 
PKG_CPPFLAGS=-I$(LIB_GSL)/include -I../inst/include 
PKG_LIBS=-L$(LIB_GSL)/lib/x64 -lgsl -lgslcblas $(SHLIB_OPENMP_CFLAGS) 
PKG_CFLAGS=$(SHLIB_OPENMP_CFLAGS) 

它基本上是从各种来源复制的。就像这样,这个编译在我的电脑中(使用Rtools的工具链),如果我删除PKG_CFLAGS=$(SHLIB_OPENMP_CFLAGS),我也可以在没有OpenMP的情况下进行编译(出于某种原因,我不明白如果我在PKG_LIBS中删除OpenMP标志,我会得到错误)。

我的Makevars文件看起来完全相同,但我无法访问Unix平台,因此我不确定如何处理这一方。我的猜测是我需要用LIB_GSL替换一些东西?

编辑:

好吧,我想我终于明白了如何配置等工作,并能得到的一切工作。

Makevars.win

## This assumes that the LIB_GSL variable points to working GSL libraries 
PKG_CPPFLAGS=-I$(LIB_GSL)/include -I../inst/include 
PKG_LIBS="-L$(LIB_GSL)/lib/$(R_ARCH)" -lgsl -lgslcblas $(SHLIB_OPENMP_CFLAGS) 
PKG_CFLAGS=$(SHLIB_OPENMP_CFLAGS) 

Makevars.in

GSL_CFLAGS = @[email protected] 
GSL_LIBS = @[email protected] 

PKG_LIBS=$(GSL_LIBS) $(SHLIB_OPENMP_CFLAGS) 
PKG_CFLAGS=$(GSL_CFLAGS) $(SHLIB_OPENMP_CFLAGS) 

而且我configure.ac:

AC_INIT([testpackage], 0.0.1) 

## Use gsl-config to find arguments for compiler and linker flags 
## 
## Check for non-standard programs: gsl-config(1) 
AC_PATH_PROG([GSL_CONFIG], [gsl-config]) 
## If gsl-config was found, let's use it 
if test "${GSL_CONFIG}" != ""; then 
    # Use gsl-config for header and linker arguments 
    GSL_CFLAGS=`${GSL_CONFIG} --cflags` 
    GSL_LIBS=`${GSL_CONFIG} --libs` 
else 
    AC_MSG_ERROR([gsl-config not found, is GSL installed?]) 
fi 

# Now substitute these variables in src/Makevars.in to create src/Makevars 
AC_SUBST(GSL_CFLAGS) 
AC_SUBST(GSL_LIBS) 

AC_OUTPUT(src/Makevars) 

然后我在testpackage目录下运行,以autoconf的获得configure文件,这在运行时将Makevars.in转换为MakevarsR CMD INSTALL

+0

尝试一个虚拟机与Linux – phonixor 2014-11-24 12:22:36

回答

0

有几个CRAN包使用GSL和/或我们的RcppGSL绑定。以下是我在其中一个(我RcppZiggurat包)做:

PKG_CPPFLAGS = -I. -I../inst/include 
## Use the R_HOME indirection to support installations of multiple R version 
PKG_LIBS = `$(R_HOME)/bin/Rscript -e "RcppGSL:::LdFlags()"` 

这是整个/src/Makevars。你可以从R中添加相同的OpenMP变量。这当然会创建对RcppGSL的依赖关系(因为我已经在RcppZiggurat中使用它)。否则,您可以查看RcppGSL的R/init.R并查看它如何尝试与gsl-config对话并存储这些值。你可以在src/Makevars中做同样的事 - 它只是基本的使用和没有特定的Rcpp。

+0

谢谢,我想我应该看起来更像Google搜索。我现在从CRAN下载了RcppZiggurat和RcppGSL的源代码,并且在RcppZiggurat的Makevars中还有'$(R_HOME)/ bin/Rscript -e“Rcpp ::: LdFlags()”'。我虽然Rcpp ::: LdFlags是depracated?而在RcppGSL中没有文件R/init.R? – Jouni 2014-11-25 08:06:15

+0

我从RcppGSLExample复制'configure'和'configure.ac'文件并相应地修改'Makevars.in'。找到一种方式来测试与Linux和似乎工作正常。 – Jouni 2014-11-25 08:31:08

+0

是的,那个电话可以被删除,因为它现在是空的。感谢您的提醒。 – 2014-11-25 14:33:00