2016-10-06 25 views
-2

WindowsでCライブラリのラッパー(gslを使用する)であるRパッケージをビルドしようとしています。必要に応じてLinuxに移行することができます。 Cライブラリのmakeコマンドは、Makevars.inに入れてください。 RstudioのRcppスケルトン機能を使ってパッケージを作成しました。私はRtools 3.3をインストールし、R 3.3.1を使用しました。Rcpp使用時の未定義参照

そして、RcppとRcppGSLをDESCRIPTIONのLinkingToフィールドに含めました。私はまだ

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であるように思わ

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

makeコマンドのために未定義の参照のエラーを取得しています 私はLinkingToを使用していて、Rパッケージを作成しようとしています

編集:最初の回答として、私は次のMakevars.winでRcppZigguratを構築しようとしました:

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'の最初の顕著な行は便利ですが、[this](http://stackoverflow.com/questions/8061254/calling-r-function-from-c-on-windows)はあなたの問題 – hrbrmstr

答えて

1

あなたは、これがどのように動作するかの誤解があります

  1. DESCRIPTIONLinkingTo:フィールドは、その名前にもかかわらず、リンクしませんが。ヘッダーファイルのみに役立ちます。だからあなたのパッケージでコンパイルされましたが、リンクされませんでした。

  2. リンカーの手順が必要です。これまでに述べたように、mvabundRcppZigguratパッケージは両方ともRcppGSLのツールを使用してGSLにリンクします。

RcppZigguratは、小さいほど良い例である。 RcppGSLにはan entire example packageも含まれています。これは参考として、またユニットテストでも使用しています。

+0

RcppZigguratビルディングでもエラーが発生しています。これはMakevars.win PKG_CPPFLAGS = -Iです。 -I .../inst/include -IC:/ tools/gsl/include ##複数のRバージョンのインストールをサポートするには、R_HOME間接指示を使用してください。 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

ために、このテンプレートを使用して実行している構築し、事前に構築されたGSLウィンドウライブラリが置かれていたら、このスクリプトはMakevars.win https://github.com/adalisan/RGraphM/blob/master/configure.win

を作成し、取得することができましたenvで定義されたディレクトリにある。 var LIB_GSLでは、コンパイルとリンクの両方の手順が有効でした。

一つの小さな問題は、事前に構築されたライブラリdownloaded hereためのzipファイルにはあなたが右のバージョンとその-L"$(LIB_GSL)\lib\$(ARCH)"引数に対してリンクすることを確認する必要があります 二つのサブアーキテクチャ(i386およびx64)のための2つのサブディレクトリがある含まれていることですリンカーの呼び出しでは、サブアーチの正しいディレクトリに評価されます。 gslベースのコードのパッケージ化を容易にするためのRcppとRcppGSLの作成者に感謝します。