【问题标题】:linking with RcppArmadillo (lapack) fails: undefined symbol: dgesdd_与 RcppArmadillo (lapack) 链接失败:未定义符号:dgesdd_
【发布时间】:2016-08-11 04:00:29
【问题描述】:

我目前正在用 RcppArmadillo 编写一个 R 包packageFoo。但是,我在 linux 中编译我的包时遇到问题。如果有人可以帮助我,我会非常高兴。我不知道我做错了什么。

我只有一个带有以下标头的 cpp 文件:

#include <stdio.h>
#include <string>
#include <bitset>
#include <fstream>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]

using namespace Rcpp;

当我执行devtools::load_all() 时,我得到以下信息:

* installing *source* package ‘packageFoo’ ...
** libs
g++ -I/usr/share/R/include -DNDEBUG   -I"/home/user/R/x86_64-pc-linux-gnu-library/3.2/Rcpp/include" -I"/home/user/R/x86_64-pc-linux-gnu-library/3.2/RcppArmadillo/include"   -fpic  -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -g  -c RcppExports.cpp -o RcppExports.o
g++ -I/usr/share/R/include -DNDEBUG   -I"/home/user/R/x86_64-pc-linux-gnu-library/3.2/Rcpp/include" -I"/home/user/R/x86_64-pc-linux-gnu-library/3.2/RcppArmadillo/include"   -fpic  -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -g  -c functions.cpp -o functions.o
g++ -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o packageFoo.so RcppExports.o functions.o -L/usr/lib/R/lib -lR
installing to /tmp/Rtmpvf8B08/devtools_install_63383fe5bd9a/packageFoo/libs
* DONE (packageFoo)
Loading required package: Matrix
Error in dyn.load(dllfile) : 
  unable to load shared object '/home/user/Documents/packageFoo/src/packageFoo.so':
  /home/user/Documents/packageFoo/src/packageFoo.so: undefined symbol: dgesdd_

我搜索了一下,发现dgesdd_lapack 的一部分。检查与packageFoo.soldd 的链接不会显示任何链接的lapack 库。

    linux-vdso.so.1 =>  (0x00007ffc3615f000)
    libR.so => /usr/lib/libR.so (0x00007f696e061000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f696dd5d000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f696da57000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f696d841000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f696d47c000)
    libblas.so.3 => /usr/lib/libblas.so.3 (0x00007f696d1ff000)
    libreadline.so.6 => /lib/x86_64-linux-gnu/libreadline.so.6 (0x00007f696cfb9000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f696cd7b000)
    liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f696cb59000)
    libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x00007f696c949000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f696c730000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f696c528000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f696c324000)
    libgomp.so.1 => /usr/lib/x86_64-linux-gnu/libgomp.so.1 (0x00007f696c115000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f696bef7000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f696e831000)
    libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f696bcce000)

我的MakeVars 文件如下所示:

PKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) 

如 RcppArmadillo 文档中所述。运行R CMD config LAPACK_LIBS 返回-llapack

我正在使用 Rcpp_0.12.4RcppArmadillo_0.6.700.3.0devtools_1.11.0 运行 R 3.2.5

【问题讨论】:

  • MakeVars 应该是 MakevarsMakevars.win 并放置在 src/ 目录中。出于纯粹的好奇,RcppArmadillo_0.6.500.* 是否为您工作? devtools::install_version('RcppArmadillo','0.6.500.4.0')
  • 谢谢。将MakeVars 重命名为Makevars 解决了这个问题。如果我们按照@Dirk 的建议使用RcppArmadillo.package.skeletonO(),则应该避免愚蠢的错误。我可以接受 Dirk 的回答,或者您自己回答。

标签: r rcpp armadillo devtools


【解决方案1】:

作为您引用的链接行,您的包或设置有问题:

g++ -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro \
        -o packageFoo.so RcppExports.o functions.o \
        -L/usr/lib/R/lib -lR

是否包含 LAPACK/BLAS 库。

也许从RcppArmadillo.package.skeleton() 的简单包重新开始并进行比较?

【讨论】:

  • 所以问题是MakeVars 应该是Makevars。我很抱歉。如果我们使用RcppArmadillo.package.skeletonO(),这个问题应该可以避免
  • 没错。这就是为什么要使用辅助函数来创建这些节。
【解决方案2】:

问题在于Makevars 文件的名称。具体来说,将MakeVars 的名称更改为Makevars(Unix / Linux)或Makevars.win(Windows),并确保它位于src/ 目录中。

【讨论】:

    猜你喜欢
    • 2023-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多