Rcpp: установить пакет со статическими библиотеками для независимого от платформы использования

Я хочу использовать libDAI C ++ библиотека в R-пакете и хотите пакет:

  1. для использования в Linux и Windows
  2. сэкономить место на диске (внешняя библиотека имеет ~ 60 Мб)
  3. конечному пользователю не нужно устанавливать boost и gmp для компиляции

Моя текущая настройка:

  • прекомпилировать libDAI
    • скопируйте libdai.a в lib /
    • скопируйте все заголовочные файлы libDAI в inst / include
  • добавить Макевар в src /

Изменить файл Makevar:

# include libraries
PKG_CPPFLAGS =-I../inst/include/
PKG_LIBS = -Llib -l../lib/libdai.a

Мой скрипт для доступа к библиотеке libDAI (test.cpp в src /):

#include <dai/factorgraph.h>
#include <Rcpp.h>
#include <cmath>

using namespace Rcpp;
using namespace std;
using namespace dai;

//'
//' Creates libDAI factor graph object
//'
//' @param factor_graph character definition of the factor graph
//' @export
// [[Rcpp::export]]
void initialize_factor_graph(const char* factor_graph) {

// read the factor graph from the string
std::istringstream fgStream(factor_graph);
FactorGraph net;
net.ReadFromString( fgStream );

// Output some information about the factorgraph
cout << "Factor graph has " << net.nrVars() << " variables" << endl;
cout << "Factor graph has " << net.nrFactors() << " factors" << endl;

}

Бег Rscript -e "Rcpp::compileAttributes('libdai')", с последующим R CMD INSTALL libdai возвращает ошибку:

Error: package or namespace load failed for 'libdai' in dyn.load(file, DLLpath = DLLpath, ...):
unable to load shared object
'/home/jk/libs/R/libdai/libs/libdai.so':
/home/jk/libs/R/libdai/libs/libdai.so: undefined symbol: _ZTVN3dai11FactorGraphE
Error: loading failed

Итак, мои вопросы:

  • Что не так с моей настройкой?
  • Как лучше всего поделиться своим окончательным пакетом на CRAN?
  • Какая самая лучшая настройка для обмена пакетом?

Мой вопрос тесно связан с этот а также этот вопрос и несколько других постов, связанных со ссылками на статические библиотеки, однако мне не удалось решить мою проблему с этими ссылками.

1

Решение

Вы можете использовать -L<directory> -l<name> или же <path>то есть в вашем случае

PKG_LIBS = -L../lib -ldai

или же

PKG_LIBS = ../lib/libdai.a

Заголовки для libDAI используются только для внутреннего использования. Нельзя ссылаться на функции, объявленные в этих заголовках. Я бы поэтому не использовал inst/include для этих заголовков.

Библиотека gmp доступна для сборщиков CRAN, c.f. https://github.com/cran/gmp а также https://cran.r-project.org/package=gmp. Похоже, что libDAI требует соединение повысить (варианты программы), ср. https://bitbucket.org/jorism/libdai/src/83bd24a4c5bf17b0592a7b5b21e26bf052881833/Makefile.LINUX?at=master&FileViewer = файл вид по умолчанию # Makefile.LINUX-49. Тем не менее, глядя на фактическую Makefile кажется, это используется только для тестов и служебных программ. Таким образом, вы могли бы сойти с толчка заголовки предоставлено пакетом BH.

Это общий подход в Windows (см. https://github.com/rwinlib), но я нахожу это необычным для Linux. Более распространенный подход будет одним из:

  • включите исходники в пакет и скомпилируйте во время настройки или установки пакета
  • скачать исходники и скомпилировать во время настройки
  • связь с системной библиотекой (хотя я не видел ни одного для libDAI).

Для всех трех подходов есть множество примеров на CRAN и GitHub. Трудно дать рекомендацию, хотя. Я, вероятно, хотел бы пойти «включить исходники в пакет» и использовать Makefile, предоставленный апстримом в качестве отправной точки для сборки библиотеки.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector