我正在编写将在 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
我的错误在哪里?
我怀疑这与未正确链接到 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 上,使用-dynamiclib
switch 代替-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.load
的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
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
我没有直接回答您的问题,但您是否尝试过http://cran.r-project.org/web/packages/RcppGSL/index.html或http://cran.r-project.org/web/packages /RcppArmadillo/index.html ?