我正在创建一个新的R包,我想调用一个外部c库(libcouchbase)。
我的问题是如何让包构建系统在链接期间找到库。我正在使用类似linux / ubuntu的系统。
这是我到目前为止所做的:
AC_INIT(rcouchbase, version-0.1)
AC_CHECK_LIB([couchbase], [lcb_create], [],
[AC_MSG_ERROR(Failed to locate libcouchbase >= 2.0.0)])
COUCHBASE_LIBS="$LIBS"
AC_SUBST(COUCHBASE_LIBS)
AC_OUTPUT(src/Makevars)
system("autoconf configure.ac > configure | chmod +x configure")
# set by configure
COUCHBASE_LIBS = @COUCHBASE_LIBS@
PKG_LIBS = $(COUCHBASE_LIBS)
当我构建我的包时,配置文件成功找到
==> R CMD INSTALL --no-multiarch --with-keep.source rcouchbase
这里有一些重要的输出:
==> R CMD INSTALL --no-multiarch --with-keep.source rcouchbase
* installing to library ‘/home/agstudy/R/packages’
* installing *source* package ‘rcouchbase’ ...
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for lcb_create in -lcouchbase... yes
configure: creating ./config.status
config.status: creating src/Makevars
make: Nothing to be done for `all'.
** libs
installing to /home/agstudy/R/packages/rcouchbase/libs
** R
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
Error in dyn.load(file, DLLpath = DLLpath, ...) :
unable to load shared object '/home/agstudy/R/packages/rcouchbase/libs/rcouchbase.so':
/home/agstudy/R/packages/rcouchbase/libs/rcouchbase.so: undefined symbol: lcb_destroy
Error: loading failed
Execution halted
ERROR: loading failed
* removing ‘/home/agstudy/R/packages/rcouchbase’
Exited with status 1.
那么有谁知道我应该添加到我的makevars / config文件来解决linkng问题?
ldd libcouchbase.so
linux-vdso.so.1 => (0x00007fff0a7fe000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fea0a26e000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fea0a06a000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fea09ca1000)
/lib64/ld-linux-x86-64.so.2 (0x00007fea0a7c5000)
答案 0 :(得分:1)
当您说COUCHBASE_LIBS="$LIBS"
时,谁为您填写$LIBS
?
第一步,尝试分解问题。你应该把我们分开:src/Makevars.in
,但是
不是生成的src/Makevars
。它是否列出了正确的库?
另外,请查看/显示我们R CMD INSTALL ...
输出。是否与图书馆有链接步骤?
您发布的内容并未显示lcb_destroy
符号丢失。
如果您想了解Autotools / Automake,我已经回到this (older) tutorial几次;你会发现它很有用。
编辑:你仍然感到困惑。我们不希望看到ldd libcouchbase
;我们假设一个人没事。 您的包未加载,因此我们需要其链接步骤和其 ldd输出。
即。我的RQuantLib包在
上结束R CMD INSTALL
g++ -shared -o RQuantLib.so [many .o files removed] \
-L/usr/lib -lQuantLib -L/usr/lib/R/lib -lR
清楚地表明它确实与(必需的)QuantLib库链接。