2016-08-25 16 views
2

私の知るCは非常に新しいユーザーとしては限られています。私はRで使う必要があるCで書かれたコードをいくつか持っています。 "gsl_integration" GSLライブラリがインストールされていない可能性のある人々にコードを渡す必要があるため、 "gsl_integration"ライブラリのすべての関数と依存関係を含む "integration.h"ファイルを作成しました。私はGSLライブラリのR - シンボルが見つかりません

$ R CMD SHLIB code.c 

を使用して、私のcode.cファイルをコンパイルすることができるよ、これは私が手にRIに「code.so」ファイルをdyn.loadしようとすると、私は

-I/Library/Frameworks/R.framework/Resources/include -DNDEBUG 
-I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include 
-fPIC -Wall -mtune=core2 -g -O2 -c code.c -o code.o 
clang -dynamiclib -Wl,-headerpad_max_install_names -undefined 
dynamic_lookup -single_module -multiply_defined suppress 
-L/Library/Frameworks/R.framework/Resources/lib -L/usr/local/lib -o code.so code.o 
-F/Library/Frameworks/R.framework/.. 
-framework R -Wl,-framework -Wl,CoreFoundation 

を取得し、出力されます次のエラー

Error in dyn.load("code.so") : 
    unable to load shared object '/Users/Thodoris/Desktop/Int_C/code.so': 
    dlopen(/Users/Thodoris/Desktop/Int_C/code.so, 6): Symbol not found: _gsl_integration_qags 
    Referenced from: /Users/Thodoris/Desktop/Int_C/code.so 
    Expected in: flat namespace 
in /Users/Thodoris/Desktop/Int_C/code.so 

私はこのライブラリを見つける方法が間違っていると思いますか? どのように私はそれを修正することができますアイデア?

答えて

2

あなたはGSLとリンクしていません。

セットアップあなたが模倣することをお勧めします一つのパッケージには、これを行い、私のRcppZigguratパッケージです:それはあることを学習し、私のRcppGSLパッケージへのコールのおかげで、適切なライブラリの場所を返す関数を持っている。すなわち

PKG_LIBS = `$(R_HOME)/bin/Rscript -e "RcppGSL:::LdFlags()"` 

場所はパッケージの起動時に1回です。

+0

ご協力いただきありがとうございます。ターミナルからコンパイルする際にライブラリの場所を含める必要がありますか?すなわちR CMD SHLIB code.c -lib_loc?これは、他人がGSLライブラリをインストールしなければならないことを意味するのでしょうか、それとも、code.soファイルに必要なものがすべてあるでしょうか? – Thor6

+0

はい、場所を追加するには '-L ... location ... -lgsl lgslblas'が必要です。これはコンピュータからOS、OSによって異なる場合があります。そのため、RcppGSLが' gsl-config ' - そして実際のライブラリ。 –

+1

ありがとう、ダーク、それは働いた。 "PKG_LIBS = -L/usr/gsl/lib -lgsl -lgslcblas -lm"という行を使って作業ディレクトリにMakevarsファイルを追加しました – Thor6

関連する問題