2016-10-06 2 views
-2

Я пытаюсь создать пакет R, который является оберткой вокруг библиотеки C (и которая использует gsl) в Windows. Я могу перейти на Linux, если необходимо К лучшему или худшему, я помещаю команды make для библиотеки C в Makevars.in. Я использовал функцию Rcpp Rstudio для создания пакета. Я установил Rtools 3.3 и использовал R 3.3.1Неопределенные ссылки при использовании Rcpp

и я включил Rcpp и RcppGSL в поле LinkingTo ОПИСАНИЕ. Я до сих пор получаю неопределенные эталонные ошибки для команды макияжа

$(CXX) $(CXXFLAGS) $(OBJECTS) ../inst/libgraphm.a $(PKG_LIBS) 

Некоторых ошибок является

c:/Rtools/mingw_64/bin/g++ -shared -s -static-libgcc -o RGraphM.dll tmp.def graphmatch_rcpp.o RcppExports.o -L../inst -lgraphm -LC:/tools/gsl/lib/x64 -lgsl -lgslcblas -Ld:/Compiler/gcc-4.9.3/local330/lib/x64 -Ld:/Compiler/gcc-4.9.3/local330/lib -LC:/PROGRA~1/R/R-33~1.1/bin/x64 -lR 
#cd graphm && /usr/bin/make 
c:/Rtools/mingw_64/bin/g++ -O2 -Wall -mtune=core2 graphmatch_rcpp.o RcppExports.o ../inst/libgraphm.a -L../inst -lgraphm -LC:/tools/gsl/lib/x64 -lgsl -lgslcblas 
graphmatch_rcpp.o: In function `PreserveStorage': 
C:/Users/sadali/Documents/R/win-library/3.3/Rcpp/include/Rcpp/storage/PreserveStorage.h:10: undefined reference to `__imp_R_NilValue' 
graphmatch_rcpp.o: In function `Vector': 
C:/Users/sadali/Documents/R/win-library/3.3/Rcpp/include/Rcpp/vector/Vector.h:58: undefined reference to `Rf_allocVector' 
graphmatch_rcpp.o: In function `Rcpp_ReplaceObject': 

Ответ на этот вопрос похож (в моих глазах) вопрос кажется неприменимой Undefined reference errors when including Rcpp.h как я использую LinkingTo и пытаюсь создать пакет R

Редактировать: в качестве первого ответа я попытался построить RcppZiggurat со следующим Makevars.win:

PKG_CPPFLAGS = -I. -I../inst/include -IC:/tools/gsl/include 
## Use the R_HOME indirection to support installations of multiple R version 
PKG_LIBS = $(LDFLAGS) -L../inst -L$(LIB_GSL)/lib/x64 $(shell "${R_HOME}/bin${R_ARCH_BIN}/Rscript.exe" -e "RcppGSL:::LdFlags()") 

Я получаю эти ошибки.

ziggurat.o:ziggurat.cpp:(.text+0x86): undefined reference to `gsl_rng_free' 

ziggurat.o:ziggurat.cpp:(.text+0xa6): undefined reference to `gsl_rng_free' 
ziggurat.o:ziggurat.cpp:(.text+0xc6): undefined reference to `gsl_rng_free' 
ziggurat.o:ziggurat.cpp:(.text+0x1254): undefined reference to `gsl_rng_set' 
+1

первые полезные строки из 'graphmatch_rcpp.cpp' были бы полезны, но [это] (http://stackoverflow.com/questions/8061254/calling-r-function-from-c-on-windows) может быть вашим выпуск – hrbrmstr

ответ

1

У вас есть непонимание того, как это работает:

  1. LinkingTo: поле DESCRIPTION не связывая, несмотря на свое название. Это помогает только для файлов заголовков. Вот почему ваш пакет составлен, но не связался.

  2. Вам нужны ссылки. Как уже было сказано, пакеты и RcppZiggurat соединяются с GSL с помощью инструмента от RcppGSL.

В частности, это может быть хорошим примером для подражания, поскольку он является небольшим. Существует также an entire example package, включенный в RcppGSL - который мы используем в качестве эталона, а также в модульном тестировании.

+0

. Я тоже получаю ошибки в здании RcppZiggurat. Это Makevars.win PKG_CPPFLAGS = -I. -I ../ inst/include -IC:/tools/gsl/include ## Использовать обратную связь R_HOME для поддержки установок с несколькими версиями R PKG_LIBS = $ (LDFLAGS) -L ../ inst -L $ (LIB_GSL)/lib/x64 $ (shell "$ {R_HOME}/bin $ {R_ARCH_BIN} /Rscript.exe" -e "RcppGSL ::: LdFlags()") –

+0

Вы можете захотеть отладить его, посмотрев, как устанавливаются значения и какие ценности вы получаете. Он работает для создания окон в CRAN - возможно, у вас просто нет установленной переменной среды окружения GSL. –

+0

Каталоги, похоже, мне нравятся. Это команда, которая запускается: c:/Rtools/mingw_32/bin/g ++ -shared -s -static-libgcc -o RcppZiggurat.dll tmp.def RcppExports.o ziggurat.o -L ../ inst -LC:/tools/gsl/lib/x64 -LC:/tools/gsl/lib -lgsl -lgslcblas -Ld: /Compiler/gcc-4.9.3/local330/lib/i386 -Ld: /Compiler/gcc-4.9.3/local330/lib -LC: /PROGRA~1/R/R-33~1.1/bin/i386 -lR –

0

я смог окно строить работает успешно, используя этот шаблон для Makevars.win https://github.com/adalisan/RGraphM/blob/master/src/Makevars.win.gen

и этот скрипт создает Makevars.win https://github.com/adalisan/RGraphM/blob/master/configure.win

После того, как предварительно построенные GSL окна были введены библиотеки в каталоге, определенном env. var LIB_GSL, как выполняются шаги компиляции, так и ссылки.

Одна небольшая проблема в том, что почтовый файл для готовых библиотек downloaded here включают есть два подкаталога для двух суб-архитектур (i386 и x64) Вы должны убедиться, что вы связываете с правой версии и -L"$(LIB_GSL)\lib\$(ARCH)" аргумент в вызовах компоновщика оценивается в правый каталог для подархива. Благодаря создателям Rcpp и RcppGSL для упрощения упаковки кода на основе gsl.

Смежные вопросы