gpt4 book ai didi

c++ - R CMD SHLIB 使用 RcppArmadillo 编译错误

转载 作者:太空宇宙 更新时间:2023-11-04 11:33:17 25 4
gpt4 key购买 nike

我正在尝试使用 RcppArmadillo 创建一个共享对象,但在让编译器找到所有 header 时遇到了问题。这个问题与我在代码中实际使用 RcppArmadillo 无关。

我在 Linux/Ubuntu 上运行。

这是一个非常简单的 cpp 文件,说明了这一点。这是真实文件的精简版。您会看到我什至删除了对 RcppArmadillo 的任何使用(尽管它确实使用了 Rcpp)。因为我包含了 RcppArmadillo.h,所以我知道我也应该注意包含 Rcpp.h。尽管如此,我还是遇到了同样的错误。

//simpleexample.cpp
#include <RcppArmadillo.h>
#include <cstdlib>
#include <iostream>

using namespace Rcpp;
using namespace RcppArmadillo;
using namespace std;

RcppExport SEXP test_nnls(SEXP Ain, SEXP bin){

int m,n;
NumericMatrix Amat(Ain);
NumericMatrix bvec(bin);
m = Amat.nrow(); n = Amat.ncol();
NumericMatrix xvec(n,1);

return(xvec);
}

相关头文件位于该目录下。

arwen$ pwd
/usr/local/linux/lib/R/Current/x86_64/site-library/RcppArmadillo/include
arwen$ ls -al
total 89
drwxr-xr-x 5 scf scfstaff 15 Feb 22 01:44 ./
drwxr-xr-x 13 scf scfstaff 18 Feb 22 01:44 ../
-rw-r--r-- 1 scf scfstaff 19882 Feb 22 01:44 armadillo
drwxr-xr-x 2 scf scfstaff 390 Feb 22 01:44 armadillo_bits/
drwxr-xr-x 2 scf scfstaff 8 Feb 22 01:44 RcppArmadillo/
-rw-r--r-- 1 scf scfstaff 6963 Feb 22 01:44 RcppArmadilloAs.h
-rw-r--r-- 1 scf scfstaff 2763 Feb 22 01:44 RcppArmadilloConfig.h
drwxr-xr-x 2 scf scfstaff 3 Feb 22 01:44 RcppArmadilloExtensions/
-rw-r--r-- 1 scf scfstaff 4529 Feb 22 01:44 RcppArmadilloForward.h
-rw-r--r-- 1 scf scfstaff 2169 Feb 22 01:44 RcppArmadillo.h
-rw-r--r-- 1 scf scfstaff 1084 Feb 22 01:44 RcppArmadilloLapack.h
-rw-r--r-- 1 scf scfstaff 1084 Feb 22 01:44 RcppArmadilloLapack.h.in
-rw-r--r-- 1 scf scfstaff 1280 Feb 22 01:44 RcppArmadilloSugar.h
-rw-r--r-- 1 scf scfstaff 10817 Feb 22 01:44 RcppArmadilloWrap.h
-rw-r--r-- 1 scf scfstaff 232 Feb 22 01:44 README

所以现在我尝试使用 R CMD SHLIB 创建共享对象,但出现以下错误。

arwen$ PKG_LIBS=`Rscript -e "Rcpp:::LdFlags()"`
arwen$ PKG_CXXFLAGS=`Rscript -e "RcppArmadillo:::CxxFlags()"`
arwen$ R CMD SHLIB simpleexample.cpp
g++ -I/usr/share/R/include -DNDEBUG -I"/server/linux/lib/R/3.0/x86_64/sitelibrary/RcppArmadillo/include" -fpic -O3 -pipe -g -c simpleexample.cpp -o simpleexample.o
In file included from /server/linux/lib/R/3.0/x86_64/site-library/RcppArmadillo/include/RcppArmadillo.h:30:0,
from simpleexample.cpp:2:
/server/linux/lib/R/3.0/x86_64/site-library/RcppArmadillo/include/RcppArmadilloForward.h:26:24: fatal error: RcppCommon.h: No such file or directory
compilation terminated.
make: *** [simpleexample.o] Error 1

所以发生的事情是编译器确实找到了 RcppArmadillo.h,如下所示:

...
#include <RcppArmadilloForward.h>
#include <Rcpp.h>
#include <RcppArmadilloWrap.h>
#include <RcppArmadilloAs.h>
#include <RcppArmadilloSugar.h>
...

然后它转到 RcppArmadillo.h,它看起来像下面这样:

...
#include <RcppCommon.h>
...

并且 RcppCommon.h 不在 /usr/local/linux/lib/R/Current/x86_64/site-library/RcppArmadillo/include 中。相反,它位于 /usr/local/linux/lib/R/Current/x86_64/site-library/Rcpp/include 中。所以我遇到麻烦也就不足为奇了。

问题:如何设置 PKG_LIBS 和 PKG_CXXFLAGS(以及其他任何内容)以便编译器可以找到这两个目录?如果我尝试将 PK_CXXFLAGS 指向 Rcpp 目录,则编译器找不到 RcppArmadillo.h。

最佳答案

快速的:

  1. 为什么您认为使用命令行方法更好?我们一直在推荐替代品。

  2. 我确实理解并重视从命令行执行此操作的优点,并在 Rcpp book 的第 2 章中提供了完整的演练。 .那里有记录,我不打算在这里重复。

  3. 您可以使用 inline包代替。包和其他地方有很多示例。

  4. 更好的是,您可以使用同名的 Rcpp 包小插图中记录的 Rcpp 属性。 Rcpp Gallery 中有许多工作示例.

为了激发灵感,这里是计算外积的两行示例:

R> cppFunction('arma::mat opg(arma::vec x) { return x*x.t(); }', 
+ depends="RcppArmadillo")
R> opg(1:3)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 2 4 6
[3,] 3 6 9
R>

可以这么简单。如果您真的想知道如何设置适当的标志,请在 verbose=TRUE 模式下运行它,它会告诉您...

关于c++ - R CMD SHLIB 使用 RcppArmadillo 编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23796164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com