Я пытаюсь получить код на C ++ для компиляции с использованием sourceCpp и RcppArmadillo. Я использую R 3.3.3 в Ubuntu, Rcpp 0.12.10 и RcppArmadillo 0.7.800.2.0. Файл armatest.cpp полностью урезан.
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
using namespace arma;
using namespace Rcpp;
int one() {
return 1;
}
Когда я пытаюсь скомпилировать это с сервера Rstudio, я получаю следующую ошибку компиляции:
> Rcpp::sourceCpp("armatest.cpp", verbose = TRUE, rebuild=TRUE)
Generated extern "C" functions
--------------------------------------------------------#include <Rcpp.h>
Generated R functions
-------------------------------------------------------
`.sourceCpp_1_DLLInfo` <- dyn.load('/tmp/Rtmp3oSZra/sourceCpp-x86_64-pc-linux-gnu-0.12.10/sourcecpp_47d41ae4918/sourceCpp_10.so')rm(`.sourceCpp_1_DLLInfo`)
Building shared library
--------------------------------------------------------
DIR: /tmp/Rtmp3oSZra/sourceCpp-x86_64-pc-linux-gnu-0.12.10/sourcecpp_47d41ae4918
/usr/lib/R/bin/R CMD SHLIB -o 'sourceCpp_10.so' --preclean 'armatest.cpp'
g++ -I/usr/share/R/include -DNDEBUG -I"/home/amercer/R/x86_64-pc-linux-gnu-library/3.3/Rcpp/include" -I"/home/amercer/R/x86_64-pc-linux-gnu-library/3.3/RcppArmadillo/include" -I"/home/amercer" -fpic -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -g -c armatest.cpp -o armatest.o
g++ -shared -L/usr/lib/R/lib -Wl,-z,relro -o sourceCpp_10.so armatest.o -llapack -lblas -lgfortran -lm -lquadmath -L/usr/lib/R/lib -lR
/usr/share/R/share/make/shlib.mk:6: recipe for target 'sourceCpp_10.so' failed
Error in Rcpp::sourceCpp("armatest.cpp", verbose = TRUE, rebuild = TRUE) :
Error 1 occurred building shared library.
Однако, когда я запускаю R из командной строки (за пределами Rstudio-сервера) и повторяю попытку, он компилируется просто отлично.
>Rcpp::sourceCpp("armatest.cpp", verbose = TRUE, rebuild=TRUE)
Generated extern "C" functions
--------------------------------------------------------#include <Rcpp.h>
Generated R functions
-------------------------------------------------------
`.sourceCpp_1_DLLInfo` <- dyn.load('/tmp/RtmptRileh/sourceCpp-x86_64-pc-linux-gnu-0.12.10/sourcecpp_1966315b9edd0/sourceCpp_4.so')rm(`.sourceCpp_1_DLLInfo`)
Building shared library
--------------------------------------------------------
DIR: /tmp/RtmptRileh/sourceCpp-x86_64-pc-linux-gnu-0.12.10/sourcecpp_1966315b9edd0
/usr/lib/R/bin/R CMD SHLIB -o 'sourceCpp_4.so' --preclean 'armatest.cpp'
g++ -I/usr/share/R/include -DNDEBUG -I"/home/amercer/R/x86_64-pc-linux-gnu-library/3.3/Rcpp/include" -I"/home/amercer/R/x86_64-pc-linux-gnu-library/3.3/RcppArmadillo/include" -I"/home/amercer" -fpic -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -g -c armatest.cpp -o armatest.o
g++ -shared -L/usr/lib/R/lib -Wl,-z,relro -o sourceCpp_4.so armatest.o -llapack -lblas -lgfortran -lm -lquadmath -L/usr/lib/R/lib -lR
Warning message:
In Rcpp::sourceCpp("armatest.cpp", verbose = TRUE, rebuild = TRUE) :
No Rcpp::export attributes or RCPP_MODULE declarations found in source
Насколько я могу судить, они выполняют одни и те же команды с одинаковыми флагами. Чем объясняется разница? Rcpp сам по себе прекрасно работает на Rstudio-сервере, так что речь идет именно о RcppAarmadillo.
Скорее всего, что-то локальное в вашей настройке, так как оно отлично работает и в RStudio — но учтите, что я добавил // [[Rcpp::export]]
а также пример автоматического выполнения:
> Rcpp::sourceCpp("/tmp/armaQ.cpp")
> one()
[1] 1
>
Ваш пример, минимально измененный:
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
using namespace arma;
using namespace Rcpp;
// [[Rcpp::export]]
int one() {
return 1;
}
/*** R
one()
*/
Других решений пока нет …