在R项目中包含第三方库

时间:2014-10-02 16:32:59

标签: c++ r static-libraries rstudio rcpp

我试图将qpOASES c ++库与我在RStudio中构建的Rcpp项目包含在内。

我已经查看了写作R包和各种Rcpp短片。我发现此post引用了this存档的对话。使用它作为我的指导,我将qpOASES库编译为静态(libqpOASES.a和libqpOASES.so)库。关于如何在RStudio中使用外部库,我遵循了这个youtube video。视频指示我在我的R项目中创建lib和inc文件夹。在lib文件夹里面,有两个静态库文件(libqpOASES.a& libqpOASES.so)。在inc文件夹中,我已经放置了libqpOASES.hpp和一个目录qpOASES,其中包含libqpOASES.hpp引用的其他头文件。

我正在使用Windows PC,但我创建的软件包最终也需要使用unix。目前在我的MakeVars(和Makevars.win)文件中,我有以下内容:

PKG_CPPFLAGS = -I../inc
PKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) -L../lib  -llibqpOASES

当我清理并重建项目时:它会成功构建,直到以下内容:

g++ -m64 -shared -s -static-libgcc -o default.dll tmp.def LS_LocalLaplacian.o RcppExports.o    RegularizedLeastSquares.o TrainNetworks.o affinityMatrix.o dist2.o dn.o dominateSet.o rcpparma_hello_world.o -LC:/PROGRA~1/R/R-31~1.0/bin/x64 -lRlapack -LC:/PROGRA~1/R/R-31~1.0/bin/x64 -lRblas -lgfortran -L../lib -llibqpOASES -Ld:/RCompile/CRANpkg/extralibs64/local/lib/x64 -Ld:/RCompile/CRANpkg/extralibs64/local/lib -LC:/PROGRA~1/R/R-31~1.0/bin/x64 -lR
c:/rbuildtools/3.1/gcc-4.6.3/bin/../lib/gcc/i686-w64-mingw32/4.6.3/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -llibqpOASES
collect2: ld returned 1 exit status no DLL was created
ERROR: compilation failed for package 'default'

我已经检查过拼写错误的命名,但是还没有找到问题。我尝试删除" -llibqpOASES"来自PKG_LIBS声明,它编译;但是,当我尝试使用qpOASES库提供的方法时,找不到它们:

undefined reference to qpOASES::QProblem::QProblem(int, int, qpOASES::HessianType)'
RegularizedLeastSquares.o:RegularizedLeastSquares.cpp:(.text+0x2a8): undefined reference to
qpOASES::QProblem::~QProblem()'
collect2: ld returned 1 exit status
no DLL was created
ERROR: compilation failed for package 'default'

如何在RStudio中成功使用外部C ++库?

1 个答案:

答案 0 :(得分:2)

有很多现有的软件包可以做到这一点 - 我会选择其中一个,看看它是如何工作的。

一个相对较新的例子是nloptr,它绑定到NLopt。我帮助使构建的Unix方面更灵活(即,如果存在则使用库,否则下载并构建它 - 在它总是执行后者之前)。你可以将它作为一个独立的测试用例进行比较。