1

我正在编写将在 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

我的错误在哪里?

4

2 回答 2

2

我怀疑这与未正确链接到 GSL 库的共享库有关,如R-devel或有关编写 R 扩展的手册中所讨论的,建议使用Makevars文件(类似于PKG_LIBS=-L/usr/lib -lgsl)。否则,按照 中的示例help(SHLIB),您可能需要尝试:

$ R CMD SHLIB file.c -lgsl -lgslcblas

有一个简单的教程R Call GSL,它显示了调用 GSL 函数的基本设置。

我能够重现玩具示例,我将其重命名nperms.{c,r}如下(在 Mac 上,使用-dynamiclibswitch 代替-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

在 R 中运行时一切正常。但是,使用从没有进一步参数生成dyn.loadlibnperms.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

raises the following error (sorry for the French locale)

> 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
于 2012-07-05T17:51:21.057 回答
0

我没有直接回答您的问题,但您是否尝试过http://cran.r-project.org/web/packages/RcppGSL/index.htmlhttp://cran.r-project.org/web/packages /RcppArmadillo/index.html ?

于 2012-07-05T14:16:51.330 回答