2016-10-06 5 views
-2

Ich versuche, ein R-Paket, das ein Wrapper um eine C-Bibliothek (und die gsl verwendet) in Windows zu erstellen. Ich kann bei Bedarf auf Linux umsteigen Zum Besseren oder Schlechten stelle ich die make-Befehle für die C-Bibliothek in Makevars.in. Ich habe Rstudio Rcpp Skelett-Feature verwendet, um das Paket zu erstellen. Ich habe Rtools 3.3 installiert und R 3.3.1undefined Referenzen bei der Verwendung von Rcpp

verwendet und Rcpp und RcppGSL in das LinkingTo-Feld von DESCRIPTION eingefügt. Ich bin immer noch nicht definierten Referenzfehler für den Befehl make

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

Einige der Fehler sind als

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': 

Die Antwort auf diese ähnliche folgt (in meinen Augen) Frage nicht anwendbar zu sein scheint Undefined reference errors when including Rcpp.h wie ich LinkingTo bin mit und versuche, ein R-Paket

bearbeiten zu erstellen: als die erste Antwort vorgeschlagen, habe ich versucht, Gebäude RcppZiggurat mit folgendem 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()") 

Ich bekomme diese Fehler.

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

die ersten hervorstechenden Zeilen von 'graphmatch_rcpp.cpp' wären nützlich, aber [dies] (http://stackoverflow.com/questions/8061254/calling-r-function-from-c-on-windows) könnte Ihr sein Ausgabe – hrbrmstr

Antwort

1

Sie haben ein Missverständnis, wie dies funktioniert:

  1. Das LinkingTo: Gebiet der DESCRIPTION nicht verbindet, trotz seines Namens. Es hilft nur für Header-Dateien. Aus diesem Grund wurde Ihr Paket kompiliert aber nicht verknüpft.

  2. Sie benötigen Linker-Anweisungen. Wie bereits erwähnt, sind die Pakete mvabund und RcppZiggurat beide über ein Tool von RcppGSL mit der GSL verbunden.

RcppZiggurat kann insbesondere ein gutes Beispiel zu folgen, wie es klein ist. Es gibt auch an entire example package in RcppGSL enthalten - die wir als Referenz sowie in Unit-Tests verwenden.

+0

Ich bekomme Fehler mit RcppZiggurat Gebäude auch. Das ist Makevars.win PKG_CPPFLAGS = -I. -I ../inst/include -IC:/tools/gsl/include ## Verwenden Sie die R_HOME-Indirection, um Installationen von mehreren R-Versionen zu unterstützen PKG_LIBS = $ (LDFLAGS) -L ../ inst -L $ (LIB_GSL)/lib/x64 $ (Shell "$ {R_HOME}/bin $ {R_ARCH_BIN} /Rscript.exe" -e "RcppGSL ::: LdFlags()") –

+0

Sie können es debuggen, indem Sie sich ansehen, wie die Werte gesetzt sind und welche Werte du bekommst. Es funktioniert für die Windows-Builds bei CRAN - vielleicht haben Sie einfach nicht die GSL-Stammverzeichnis-Umgebungsvariable gesetzt. –

+0

Die Verzeichnisse scheinen mir gut. Dies ist der Befehl, der ausgeführt wird: 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

Ich war in der Lage, die Fenster zu bekommen bauen für Makevars.win https://github.com/adalisan/RGraphM/blob/master/src/Makevars.win.gen

und dieses Skript erstellt die Makevars.win https://github.com/adalisan/RGraphM/blob/master/configure.win

Sobald die vorgefertigten GSL Fenster Bibliotheken haben erfolgreich mit dieser Vorlage ausgeführt gesetzt worden in dem durch env definierten Verzeichnis. var LIB_GSL, sowohl die Kompilierungs- als auch die Verknüpfungsschritte funktionierten.

Ein kleines Problem ist, dass die Zip-Datei für die vorgefertigten Bibliotheken downloaded here sind es zwei Unterverzeichnisse für zwei Unter Architekturen (i386 und x64) Sie sicherstellen sollten, dass Sie einen Link an die rechte Version und dass -L"$(LIB_GSL)\lib\$(ARCH)" Argument In den Linker-Aufrufen wird das richtige Verzeichnis für den Unterzweig ausgewertet. Dank den Machern von Rcpp und RcppGSL, um das Packen von gsl-basiertem Code einfacher zu machen.

Verwandte Themen