如何将 OpenBlas Lapacke 与 Rcpp 一起使用

Ale*_*lex 3 c++ r rcpp lapacke r-package

我有一些Lapacke使用OpenBlas. 我想将此代码包含到 R 包中,并使用该Rcpp包在该函数和 R 之间传输数据。但不知为何,两人似乎并不喜欢对方。一旦我#include <lapacke.h>#include <Rcpp.h>一个源文件中,它就不再编译了。两者单独工作都很好。据我所知,有一大堆错误消息已损坏Rcpp(例如/home/Alex/R/x86_64-pc-linux-gnu-library/3.4/Rcpp/include/Rcpp/traits/traits.h:32:15: error: expected \xe2\x80\x98)\xe2\x80\x99 before \xe2\x80\x98__extension__\xe2\x80\x99).

\n\n

我不知道为什么会发生这种情况。有没有办法同时使用两者?\n或者我应该做一些完全不同的事情?

\n\n

这是一个给我错误的最小示例:

\n\n
    \n
  1. 我使用创建了一个包

    \n\n
    Rcpp::Rcpp.package.skeleton("LT", example_code = FALSE)\n
    Run Code Online (Sandbox Code Playgroud)
  2. \n
  3. 我添加了一个.cpp文件来/src包含

    \n\n
    #include <lapacke.h>\n#include <Rcpp.h>\n\nint test_LAPACK(){\n  return(1);\n}\n
    Run Code Online (Sandbox Code Playgroud)
  4. \n
  5. 我添加了一个 Makvars 文件来/src包含

    \n\n
    PKG_CXXFLAGS = -I/opt/OpenBLAS/include\nPKG_LIBS =  -L/opt/OpenBLAS/lib -lopenblas -lpthread -lgfortran\nCXX_STD = CXX11\n
    Run Code Online (Sandbox Code Playgroud)
  6. \n
  7. 编译安装

    \n\n
    Rcpp::compileAttributes("LT")\ndevtools::install("LT")\n
    Run Code Online (Sandbox Code Playgroud)
  8. \n
\n

Dir*_*tel 5

它实际上可以在我的系统上按照标准运行,sudo apt install liblapacke-dev 前提是我还更改了包含顺序

\n\n

证人:

\n\n

来源

\n\n
rob:/tmp/lapacke/LT$ cat src/lt.cpp \n#include <Rcpp.h>\n#include <lapacke.h>\n\nint test_LAPACK(){\n          return(1);\n}\nrob:/tmp/lapacke/LT$ ls src/      ## no Makevars needed\nlt.cpp\nrob:/tmp/lapacke/LT$ \n
Run Code Online (Sandbox Code Playgroud)\n\n

建造

\n\n
rob:/tmp/lapacke/LT$ build.r \n* checking for file \xe2\x80\x98./DESCRIPTION\xe2\x80\x99 ... OK\n* preparing \xe2\x80\x98LT\xe2\x80\x99:\n* checking DESCRIPTION meta-information ... OK\n* cleaning src\n* installing the package to process help pages\n* saving partial Rd database\n* cleaning src\n* checking for LF line-endings in source and make files and shell scripts\n* checking for empty or unneeded directories\nRemoved empty directory \xe2\x80\x98LT/R\xe2\x80\x99\n* building \xe2\x80\x98LT_1.0.tar.gz\xe2\x80\x99\n\nrob:/tmp/lapacke/LT$\n
Run Code Online (Sandbox Code Playgroud)\n\n

安装

\n\n
rob:/tmp/lapacke/LT$ install.r LT_1.0.tar.gz \n* installing *source* package \xe2\x80\x98LT\xe2\x80\x99 ...\n** libs\nccache g++ -I"/usr/share/R/include" -DNDEBUG  -I"/usr/local/lib/R/site-library/Rcpp/include"    -fpic  -g -O3 -Wall -pipe   -march=native -c lt.cpp -o lt.o\nccache g++ -Wl,-S -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o LT.so lt.o -L/usr/lib/R/lib -lR\ninstalling to /usr/local/lib/R/site-library/LT/libs\n** help\n*** installing help indices\n** building package indices\n** testing if installed package can be loaded\n* DONE (LT)\nrob:/tmp/lapacke/LT$ \n
Run Code Online (Sandbox Code Playgroud)\n\n

跑步

\n\n

(在我添加一行后// [[Rcpp::export]],运行compileAtttributes()并重建并安装。)

\n\n
rob:/tmp/lapacke/LT$ r -lLT -p -e\'test_LAPACK()\'\n[1] 1\nrob:/tmp/lapacke/LT$ \n
Run Code Online (Sandbox Code Playgroud)\n\n

概括

\n\n

检查你的编译器。没有根本原因这不应该工作,但它在这里工作(Ubuntu 18.04)。

\n