我试图将qpOASES c++库包含在我在RStudio中构建的Rcpp项目中。
我已经看过了编写R程序包和各种Rcpp小插曲。我找到了这个post,它引用了this存档的对话。按照我的指导,我将qpOASES库编译为静态(libqpOASES.a和libqpOASES.so)库。我遵循了这个youtube video的方法,了解如何在RStudio中使用外部库。该视频指示我在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'
我已经检查过拼写错误等事物的命名,但是还没有找到问题所在。我尝试从PKG_LIBS声明中删除“-llibqpOASES”,它会编译;但是,当我尝试使用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++库?
最佳答案
有很多现有的软件包可以执行此操作-我将采用其中一个并查看其工作方式。
相对较新的示例是nloptr,它绑定(bind)到NLopt。我帮助使构建的Unix方面更加灵活(即,要么使用库(如果存在),要么下载并构建它-在始终执行后者之前)。您也可以将此作为独立的测试用例进行比较。
关于c++ - 在R项目中包括第三方图书馆,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26165327/