使用Rcpp时未定义的引用

时间:2016-10-06 23:00:00

标签: r rcpp

我正在尝试构建一个R包,它是Windows中C库(并使用gsl)的包装器。如有必要,我可以过渡到Linux 无论好坏,我在Makevars.in中为C库放置了make命令。 我使用Rstudio的Rcpp骨架功能来创建包。我安装了Rtools 3.3并使用R 3.3.1

我在描述的LinkingTo字段中包含了Rcpp和RcppGSL。我仍然在为make命令

获取未定义的引用错误
$(CXX) $(CXXFLAGS)   $(OBJECTS)  ../inst/libgraphm.a $(PKG_LIBS)

一些错误如下

c:/Rtools/mingw_64/bin/g++ -shared -s -static-libgcc -o RGraphM.dll tmp.def graphmatch_rcpp.o RcppExports.o -L../inst -lgraphm -LC:/tools/gsl/lib/x64 -lgsl -lgslcblas -Ld:/Compiler/gcc-4.9.3/local330/lib/x64 -Ld:/Compiler/gcc-4.9.3/local330/lib -LC:/PROGRA~1/R/R-33~1.1/bin/x64 -lR
#cd graphm && /usr/bin/make
c:/Rtools/mingw_64/bin/g++  -O2 -Wall  -mtune=core2   graphmatch_rcpp.o RcppExports.o  ../inst/libgraphm.a  -L../inst -lgraphm -LC:/tools/gsl/lib/x64 -lgsl -lgslcblas
graphmatch_rcpp.o: In function `PreserveStorage':
C:/Users/sadali/Documents/R/win-library/3.3/Rcpp/include/Rcpp/storage/PreserveStorage.h:10: undefined reference to `__imp_R_NilValue'
graphmatch_rcpp.o: In function `Vector':
C:/Users/sadali/Documents/R/win-library/3.3/Rcpp/include/Rcpp/vector/Vector.h:58: undefined reference to `Rf_allocVector'
graphmatch_rcpp.o: In function `Rcpp_ReplaceObject':

这个类似(在我看来)问题的答案似乎是不适用的 Undefined reference errors when including Rcpp.h 因为我正在使用LinkingTo并尝试创建R包

编辑:作为第一个答案建议,我尝试使用以下Makevars.win构建RcppZiggurat:

PKG_CPPFLAGS = -I. -I../inst/include  -IC:/tools/gsl/include 
## Use the R_HOME indirection to support installations of multiple R version
PKG_LIBS = $(LDFLAGS) -L../inst -L$(LIB_GSL)/lib/x64 $(shell "${R_HOME}/bin${R_ARCH_BIN}/Rscript.exe" -e "RcppGSL:::LdFlags()")

我收到了这些错误。

ziggurat.o:ziggurat.cpp:(.text+0x86): undefined reference to `gsl_rng_free'

ziggurat.o:ziggurat.cpp:(.text+0xa6): undefined reference to `gsl_rng_free'
ziggurat.o:ziggurat.cpp:(.text+0xc6): undefined reference to `gsl_rng_free'
ziggurat.o:ziggurat.cpp:(.text+0x1254): undefined reference to `gsl_rng_set'

2 个答案:

答案 0 :(得分:1)

我能够使用Makevars.win的此模​​板成功运行Windows构建 https://github.com/adalisan/RGraphM/blob/master/src/Makevars.win.gen

并且此脚本创建Makevars.win https://github.com/adalisan/RGraphM/blob/master/configure.win

预先构建的gsl windows库已放入env定义的目录中。 var LIB_GSL,编译和链接步骤都有效。

一个小问题是预构建库downloaded here的zip文件包含两个子架构(i386和x64)的两个子目录 您应确保链接到正确的版本,并且链接器调用中的-L"$(LIB_GSL)\lib\$(ARCH)"参数将评估为子拱的正确目录。 感谢Rcpp和RcppGSL的创建者使得基于gsl的代码的打包更容易。

答案 1 :(得分:0)

你误解了这是如何运作的:

  1. LinkingTo:的{​​{1}}字段未链接,尽管名称不同。它只对头文件有帮助。这就是您的软件包编译但未链接的原因。

  2. 您需要链接器指令。如前所述,mvabundRcppZiggurat包都使用RcppGSL中的工具链接到GSL。

  3. RcppZiggurat尤其可能是一个很好的例子,因为它很小。 an entire example package中还包含RcppGSL - 我们将其用作参考和单元测试。