在R中为libcouchbase设置configure / makevars?

时间:2014-03-22 14:53:07

标签: r build couchbase autoconf

我正在创建一个新的R包,我想调用一个外部c库(libcouchbase)。

我的问题是如何让包构建系统在链接期间找到库。我正在使用类似linux / ubuntu的系统。

这是我到目前为止所做的:

创建configure.ac

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)

使用autoconf

生成配置
system("autoconf configure.ac > configure | chmod +x configure")

创建一个makevars.in

# 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问题?

EDIT添加共享库依赖项:

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)

1 个答案:

答案 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库链接。