我有一些使用Lapacke附带的OpenBlas版本运行的c++代码。我想将此代码包含在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 ‘)’ before ‘__extension__’)

我不知道为什么会这样。有没有办法同时使用两者?
还是我应该做一些完全不同的事情?

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

  • 我使用创建了一个包
    Rcpp::Rcpp.package.skeleton("LT", example_code = FALSE)
    
  • 我向包含以下内容的.cpp中添加了一个/src文件:
    #include <lapacke.h>
    #include <Rcpp.h>
    
    int test_LAPACK(){
      return(1);
    }
    
  • 我在包含以下内容的/src中添加了Makvars文件:
    PKG_CXXFLAGS = -I/opt/OpenBLAS/include
    PKG_LIBS =  -L/opt/OpenBLAS/lib -lopenblas -lpthread -lgfortran
    CXX_STD = CXX11
    
  • 编译并安装
    Rcpp::compileAttributes("LT")
    devtools::install("LT")
    
  • 最佳答案

    只要我还更改了包含顺序,它就可以按照标准的sudo apt install liblapacke-dev在我的系统上正常工作。

    证人:

    资源

    rob:/tmp/lapacke/LT$ cat src/lt.cpp
    #include <Rcpp.h>
    #include <lapacke.h>
    
    int test_LAPACK(){
              return(1);
    }
    rob:/tmp/lapacke/LT$ ls src/      ## no Makevars needed
    lt.cpp
    rob:/tmp/lapacke/LT$
    

    建立
    rob:/tmp/lapacke/LT$ build.r
    * checking for file ‘./DESCRIPTION’ ... OK
    * preparing ‘LT’:
    * checking DESCRIPTION meta-information ... OK
    * cleaning src
    * installing the package to process help pages
    * saving partial Rd database
    * cleaning src
    * checking for LF line-endings in source and make files and shell scripts
    * checking for empty or unneeded directories
    Removed empty directory ‘LT/R’
    * building ‘LT_1.0.tar.gz’
    
    rob:/tmp/lapacke/LT$
    

    安装
    rob:/tmp/lapacke/LT$ install.r LT_1.0.tar.gz
    * installing *source* package ‘LT’ ...
    ** libs
    ccache 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
    ccache 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
    installing to /usr/local/lib/R/site-library/LT/libs
    ** help
    *** installing help indices
    ** building package indices
    ** testing if installed package can be loaded
    * DONE (LT)
    rob:/tmp/lapacke/LT$
    



    (在我添加一行// [[Rcpp::export]],运行compileAtttributes()并重建并安装之后。)
    rob:/tmp/lapacke/LT$ r -lLT -p -e'test_LAPACK()'
    [1] 1
    rob:/tmp/lapacke/LT$
    

    概要

    检查您的编译器。没有根本原因不可行,并且在这里可行(Ubuntu 18.04)。

    关于c++ - 如何与Rcpp一起使用OpenBlas Lapacke,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53241120/

    10-12 23:26