Понимание плагинов Rcpp - PullRequest
0 голосов
/ 04 июля 2019

Я просматриваю демонстрацию, приведенную в 3.6 Rcpp-FAQ , и пытаюсь понять, как создается этот плагин.Предоставляется автономный пример:

gslrng <-
'int seed = Rcpp::as<int>(par) ;
gsl_rng_env_setup();
gsl_rng *r = gsl_rng_alloc (gsl_rng_default);
gsl_rng_set (r, (unsigned long) seed);
double v = gsl_rng_get (r);
gsl_rng_free(r);return Rcpp::wrap(v);'

plug <- Rcpp:::Rcpp.plugin.maker(
  include.before = "#include <gsl/gsl_rng.h>",
  libs = paste("-L/usr/local/lib/R/site-library/Rcpp/lib -lRcpp",
               "-Wl,-rpath,/usr/local/lib/R/site-library/Rcpp/lib",
               "-L/usr/lib -lgsl -lgslcblas -lm"))
registerPlugin("gslDemo", plug )
fun <- cxxfunction(signature(par="numeric"), gslrng, plugin="gslDemo")
fun(0)

В частности, почему этот вызов paste() разделен запятыми?Должны ли все зависимости (каталоги заголовочных файлов, каталоги компоновщиков и имена библиотечных файлов) обрабатываться с помощью плагинов?

1 Ответ

1 голос
/ 04 июля 2019

paste() - это ванильное использование базовых R paste() - он создает одну строку, содержащую все инструкции ссылки, передаваемые libs.

Для include.before нам это не нужно, поскольку передается только один заголовок.

Я бы порекомендовал вам изучить код вместе с его использованием , а также актуальный плагин для RcppGSL , который определен здесь и посмотреть, как они используются в таких пакетах, как например RcppZiggurat. Под словом «под» я понимаю, что инструкции расширяются, когда клиентские пакеты компилируются и связываются.

Это выглядит безумно сложно, но эй, это работает уже около десяти лет:)

...