Как использовать OpenBlas Lapacke вместе с Rcpp
У меня есть некоторый код на C++, использующий Lapacke
версия, которая поставляется с OpenBlas
, Я хотел бы включить этот код в пакет R и передавать данные между этой функцией и R, используя Rcpp
пакет. Но почему-то эти двое не похожи друг на друга. Как только у меня #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
содержащийPKG_CXXFLAGS = -I/opt/OpenBLAS/include PKG_LIBS = -L/opt/OpenBLAS/lib -lopenblas -lpthread -lgfortran CXX_STD = CXX11
Скомпилируйте и установите
Rcpp::compileAttributes("LT") devtools::install("LT")
1 ответ
Это на самом деле работает в моей системе, следуя стандарту 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).