Rで使用するCコードを書いています。Cで行列演算を行うために、「gsl_matrix」ライブラリを追加しました。R CMD SHLIB を使用してコンパイルすると、問題なくコンパイルされます。しかし、R を開いて dyn.load("file.so") を書き込もうとすると、次のエラー メッセージが表示されます。
unable to load shared object file.so
undefined symbol: gsl_matrix_alloc
私の間違いはどこですか?
これは、 R-devel で説明されているように、GSL ライブラリに適切にリンクされていない共有ライブラリに関係していると思われます、またはR 拡張機能の記述に関するマニュアル では、Makevars
ファイル (のようなもの)を使用することが推奨されていますPKG_LIBS=-L/usr/lib -lgsl
。それ以外の場合は、 の例に従って、次のhelp(SHLIB)
ことを試してみてください。
$ R CMD SHLIB file.c -lgsl -lgslcblas
GSL 関数を呼び出すための基本的なセットアップを示す簡単なチュートリアルR Call GSLがあります。
次のように名前を変更したおもちゃの例を再現できnperms.{c,r}
ます (Mac では、-dynamiclib
代わりにスイッチを使用します-shared
)。
~/scratch $ gcc -c nperms.c
~/scratch $ file nperms.o
nperms.o: Mach-O 64-bit object x86_64
~/scratch $ gcc -dynamiclib -lgsl -lgslcblas -o libnperms.dylib -dylib nperms.o
~/scratch $ ls *nperm*
libnperms.dylib nperms.c nperms.o
~/scratch $ file libnperms.dylib
libnperms.dylib: Mach-O 64-bit dynamically linked shared library x86_64
dyn.load
R で'ingを実行すると、すべて正常に動作します。ただし、それ以上の引数なしでlibnperms.dylib
生成された共有ライブラリを使用しますR CMD SHLIB
~/scratch $ R CMD SHLIB nperms.c
gcc -arch x86_64 -std=gnu99 -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/usr/local/lib -o nperms.so nperms.o -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation
~/scratch $ ls *nperm*
libnperms.dylib nperms.c nperms.o nperms.r nperms.so
~/scratch $ file nperms.so
nperms.so: Mach-O 64-bit dynamically linked shared library x86_64
次のエラーが発生します (フランス語のロケールでは申し訳ありません)。
> dyn.load("nperms.so")
Erreur dans dyn.load("nperms.so") :
impossible de charger l'objet partag'e '/Users/chl/scratch/nperms.so':
dlopen(/Users/chl/scratch/nperms.so, 6): Symbol not found: _gsl_permutation_alloc
Referenced from: /Users/chl/scratch/nperms.so
Expected in: flat namespace
in /Users/chl/scratch/nperms.so
あなたの質問に対する直接的な回答はありませんが、http ://cran.r-project.org/web/packages/RcppGSL/index.htmlまたはhttp://cran.r-project.org/web/packagesを試しましたか/RcppArmadillo/index.html ?