Связывание библиотек GSL с RcppGSL в Windows 10

Я написал следующий файл .cpp для получения образцов из распределения Дирихле с использованием функции распределения случайных чисел в GSL. Имя файла C_functions.cpp. Я делаю все в Windows 10.

#include <RcppArmadillo.h>
#include <RcppGSL.h>
// #include <Rcpp.h>
#include <gsl/gsl_math.h>
#include <gsl/gsl_rng.h>
#include <gsl/gsl_randist.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::depends(RcppGSL)]]



using namespace arma;


// [[Rcpp::export]]
vec rdirichlet_arma(vec a){
  const gsl_rng_type * T;
  gsl_rng * r;

    /* create a generator chosen by the
   environment variable GSL_RNG_TYPE */

  gsl_rng_env_setup();

  T = gsl_rng_default;
  r = gsl_rng_alloc (T);

  /* print n random variates chosen from
   the poisson distribution with mean
   parameter mu */

  int n=a.size();
  vec results(n);

  gsl_ran_dirichlet(r, n, a.begin(), results.begin());

  gsl_rng_free (r);
  a.reset();
  return results;
}

// [[Rcpp::export]]
double pow2(double x){
  return gsl_pow_2(x);
}

Я создал переменную среды LIB_GSL и установил ее значение как «C:/Users/nkc10/Documents/R/local323». Это место, куда я распаковал папку local323.zip, загруженную с эта ссылка.

Однако, когда я компилирую его с помощью sourceCpp, отображается следующая ошибка

>C:/RBuildTools/3.5/mingw_64/bin/g++  -std=gnu++11 -I"C:/PROGRA~1/R/R-35~1.2/include" -DNDEBUG -I../inst/include -fopenmp -I/include  -I"C:/Users/nkc10/Documents/R/win-library/3.5/Rcpp/include" -I"C:/Users/nkc10/Documents/R/win-library/3.5/RcppArmadillo/include" -I"C:/Users/nkc10/Documents/R/win-library/3.5/RcppGSL/include" -I"C:/Users/nkc10/Dropbox/Research/sparse_bayesian_infinite_factor_models-master"        -O2 -Wall  -mtune=generic -c C_functions.cpp -o C_functions.o
In file included from C:/Users/nkc10/Documents/R/win-library/3.5/RcppGSL/include/RcppGSL.h:25:0,
                 from C_functions.cpp:2:
C:/Users/nkc10/Documents/R/win-library/3.5/RcppGSL/include/RcppGSLForward.h:26:29: fatal error: gsl/gsl_vector.h: No such file or directory
 #include <gsl/gsl_vector.h> 
                             ^
compilation terminated.
make: *** [C:/PROGRA~1/R/R-35~1.2/etc/x64/Makeconf:215: C_functions.o] Error 1
Error in sourceCpp("C_functions.cpp") : 
  Error 1 occurred building shared library.

Вам также необходимо предоставить и сообщить R о файлах заголовков GSL. Компилятор сообщает вам, что они отсутствуют.

Dirk Eddelbuettel 03.05.2019 22:57

Не могли бы вы помочь мне, как внести необходимые изменения? Жаль, что у меня нет большого опыта в написании сценариев.

noirritchandra 04.05.2019 00:55

К сожалению, в Windows это находится на стороне системного администратора, и я не могу вам с этим помочь. Вы можете протестировать свой пакет, загрузив его в победитель и/или в сборщик окон р-концентратор.

Dirk Eddelbuettel 04.05.2019 01:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
754
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы близки, так как у вас уже есть файл local323.

Еще два шага:

  1. Скопируйте папку c:\local323\include\gsl в папку RcppGSL (т. е. C:\Users\YOU\Documents\R\win-library\3.6\RcppGSL\include) ИЛИ в каталог вашего проекта. Я пробовал последний, но я думаю, что он должен работать в любом случае.
  2. Из пакета local323 скопируйте libgsl.alibgslcblas.a в c:\Rtoools\mingw_64\libs. Я понятия не имею, почему он не находит его в вашей папке c:\local323, но это сработает.

И я проверил это, ваш код работает.

Возможно, это сработало, это все еще неправильно. Если и когда переменная среды настроена правильно это просто работает — посмотрите сборку CRAN, rhub и множество других сайтов.

Dirk Eddelbuettel 06.05.2019 03:48

Я мог воспроизвести проблему noirritchandra. Это не переменная env. echo %LIB_GSL% возвращает правильную папку c:\local323. В этой папке есть подпапка lib, которая, согласно предыдущему сообщению SO, теперь содержит два файла .a. Файл makevars.win RcppGSL содержит PKG_LIBS=-L$(LIB_GSL)/lib -lgsl -lgslcblas. Имейте в виду, что мы используем sourceCpp; мы не строим пакет. Может быть, makevars не передаются через sourceCpp?

inferator 06.05.2019 04:42

Кстати, noirritchandra, если вы работаете с современным дистрибутивом Linux, ваш код просто работает из коробки.

inferator 06.05.2019 17:11

Да, в Ubuntu, когда установлены пакеты libgsl, он работает просто отлично!

noirritchandra 08.05.2019 22:41

Другие вопросы по теме