Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ R包与Rcpp的链接错误:“;未定义符号:LAPACKE_dgels“;_C++_R_Linker Errors_Rcpp_Lapack - Fatal编程技术网

C++ R包与Rcpp的链接错误:“;未定义符号:LAPACKE_dgels“;

C++ R包与Rcpp的链接错误:“;未定义符号:LAPACKE_dgels“;,c++,r,linker-errors,rcpp,lapack,C++,R,Linker Errors,Rcpp,Lapack,我正在使用R API头文件“R_ext/LAPACK.h”创建一个R包“lapacker”,为R提供和使用的内部LAPACK库(仅具有双精度和双复杂度)提供C接口。源代码: 项目结构: /lapacker /inst /include /lapacke.h /someother header files /R /zzz.R /src /lapacke_dgetrf.c /lapacke_dgetrf_work.c /l

我正在使用R API头文件“R_ext/LAPACK.h”创建一个R包“lapacker”,为R提供和使用的内部LAPACK库(仅具有双精度和双复杂度)提供C接口。源代码:

项目结构:

/lapacker
  /inst
    /include
      /lapacke.h
      /someother header files
  /R
    /zzz.R
  /src
    /lapacke_dgetrf.c
    /lapacke_dgetrf_work.c
    /loads of other utility functions provided by LAPACKE 
    /rcpp_hello.cpp
  DESCRIPTION
  NAMESPACE
在项目内部,我在rcpp_hello.cpp文件中尝试了一个测试函数(注意,这个示例来自:

但是,当我创建一个单独的C++文件时,用相同的函数表示DEMO3.CPP,

#include <Rcpp.h>

#include <lapacke.h>
// [[Rcpp::depends(lapacker)]]

// [[Rcpp::export]]
void lapacke_dgels_test()
{
  double a[5][3] = {{1,1,1},{2,3,4},{3,5,2},{4,2,5},{5,4,3}};
  double b[5][2] = {{-10,-3},{12,14},{14,12},{16,16},{18,16}};
  lapack_int info,m,n,lda,ldb,nrhs;
  int i,j;

  m = 5;
  n = 3;
  nrhs = 2;
  lda = 3;
  ldb = 2;

  info = LAPACKE_dgels(LAPACK_ROW_MAJOR,'N',m,n,nrhs,*a,lda,*b,ldb);

  for(i=0;i<n;i++)
  {
    for(j=0;j<nrhs;j++)
    {
      printf("%lf ",b[i][j]);
    }
    printf("\n");
  }
}
我还检查了/R/x86_64-pc-linux-gnu-library/3.4/lapacker/libs下的lapacker.so,发现:

000000000000c6b0 g    DF .text  00000000000001bf  Base        LAPACKE_dgels

我是否错过了正确编译demo3.cpp的方法?非常感谢您的耐心和时间

您在这里面临一个难题。您试图解析的符号
lapackedgels
lapacker的一部分。因此
,在包安装期间生成。问题是,R包的库不是用来链接的。相反,它们在运行时由R动态加载。基本上,我认为有四种可能性:

  • lapacke
    转换为仅标题库,并将其安装在
    inst/include
    (c.f.
    RcppArmadillo
    )中
  • 链接到系统安装的
    lapacke
    (在Linux上很容易…)
  • 向R注册所有函数,并使用R提供的方法链接到它们(c.f.和
    nloptr
  • 编译一个用于链接的库,并将其与R包一起安装。您仍然需要一个插件才能工作,因为您必须将
    -L-L….
    添加到
    PKG_LIBS
    我确信在CRAN上有使用方法4的例子,但现在还没有想到。然而,作为一个“代码kata”,我已经将我最近的一个测试包转换为使用这种结构,c.f


    (原始答案不完整。)

    src/Makevars

    PKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)
    
    当通过Rcpp属性编译cpp文件时,需要一个模拟设置。实现这一点的最佳方法是使用Rcpp插件c.f.(调整未经测试!):


    inlinecxplugin谢谢,我会试试的。但是我感觉到它可能会产生同样的错误,就像我对另一个PKG’CBLAS'(内部和单独的C++文件都正确编译)一样。我知道犰狳,实际上我在几个项目中使用了Rcpp和RcppArmadillo。我正在实现一个矩阵库来练习C++,不幸的是它是行的主要排序。如果我想在内部使用BLAS和LAPACK,最好的选择是使用cblas.h和LAPACK.h,它们不是由R提供的。在矩阵R pkg的“描述”中添加“LinkingTo:cblasr,lapacker”,我将得到相同的链接错误。@ypan1988您是对的,我的初始解决方案将不完整。请参阅更新。顺便说一句,我很惊讶它能为cblasr工作。再次感谢!我设法解决了这个问题,最好的办法是通过选项1——将库更改为只包含头部的库。一开始我对“LinkingTo”有点困惑,它主要是为头文件添加额外的目录。
    
    > Rcpp::sourceCpp("~/Desktop/demo3.cpp", showOutput = TRUE)
    /usr/lib/R/bin/R CMD SHLIB -o 'sourceCpp_6.so'  'demo3.cpp'  
    g++  -I/usr/share/R/include -DNDEBUG   -I"/home/yipan/R/x86_64-pc-linux-gnu-library/3.4/Rcpp/include" -I"/home/yipan/R/x86_64-pc-linux-gnu-library/3.4/lapacker/include" -I"/home/yipan/Desktop"    -fpic  -g -O2 -fdebug-prefix-map=/build/r-base-AitvI6/r-base-3.4.4=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g  -c demo3.cpp -o demo3.o
    g++ -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o sourceCpp_6.so demo3.o -L/usr/lib/R/lib -lR
    Error in dyn.load("/tmp/RtmpUsASwK/sourceCpp-x86_64-pc-linux-gnu-1.0.0/sourcecpp_159e6145591d/sourceCpp_6.so") : 
      unable to load shared object '/tmp/RtmpUsASwK/sourceCpp-x86_64-pc-linux-gnu-1.0.0/sourcecpp_159e6145591d/sourceCpp_6.so':
      /tmp/RtmpUsASwK/sourceCpp-x86_64-pc-linux-gnu-1.0.0/sourcecpp_159e6145591d/sourceCpp_6.so: undefined symbol: LAPACKE_dgels
    
    000000000000c6b0 g    DF .text  00000000000001bf  Base        LAPACKE_dgels
    
    PKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)
    
    inlineCxxPlugin <- function(...) {
        plugin <-
            Rcpp::Rcpp.plugin.maker(
                      include.before = "#include <lapacke.h>",
                      libs           = "$(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)",
                      package        = "lapacker"
                  )
        settings <- plugin()
        settings$env$PKG_CPPFLAGS <- "-I../inst/include"
        settings
    }