c++x11 中的 RInside 和 Rcpp

标签 r c++11 linker rcpp rinside

我想在 c++x11 代码中使用 RInside 来调用 R 例程。默认情况下,R 似乎安装了库的 c++98 版本,因此链接不成功。我想知道我应该继续安装 c++x11 版本的 RInside 的不同步骤是什么(但我想我需要重新编译所有 R/R 包,是吗?)以及是否存在一些更简单的解决方案。提前致谢(我在 MacOs 上工作)

更新: 我重新安装了 Rcpp 和 RInside 做(我的 Makevars 是空的,所以 c++98 版本)

 sudo R CMD INSTALL ~/Downloads/Rcpp_0.10.4.tar.gz 
 sudo R CMD INSTALL ~/Downloads/RInside_0.2.10.tar.gz

然后我使用(无 cx11)编译 hello world 示例:

clang++ -I/Library/Frameworks/R.framework/Versions/2.15/Headers/ -I/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RInside/include/ -I/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/  -c ../src/Gui/test.cc -o testOut.cc.o

clang++ testOut.cc.o -o testOut -L/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RInside/lib/x86_64 -L/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/lib/x86_64 -framework R -lRInside -lRcpp

这产生了我:

  Hello, world!

但是,通过添加 x11 选项:

clang++ -I/Library/Frameworks/R.framework/Versions/2.15/Headers/ -I/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RInside/include/ -I/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/  -c ../src/Gui/test.cc -o testOut.cc.o -stdlib=libc++ -std=c++11

clang++ testOut.cc.o -o testOut -L/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RInside/lib/x86_64 -L/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/lib/x86_64 -framework R -lRInside -lRcpp -stdlib=libc++ -std=c++11

我得到(链接时):

  Undefined symbols for architecture x86_64:
   "RInside::parseEvalQ(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
  _main in testOut.cc.o
   "RInside::operator[](std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
  _main in testOut.cc.o
   "Rcpp::Environment::assign(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, SEXPREC*) const", referenced from:
        bool Rcpp::Environment::assign<char [15]>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const (&) [15]) const in testOut.cc.o

使用 c++x11 选项重新编译 Rcpp 和 RInside 时

clang++ -I/Library/Frameworks/R.framework/Versions/2.15/Headers/ -I/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RInside/include/ -I/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/  -c ../src/Gui/test.cc -o testOut.cc.o -stdlib=libc++ -std=c++11

clang++ testOut.cc.o -o testOut -L/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RInside/lib/x86_64 -L/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/lib/x86_64 -framework R -lRInside -lRcpp -stdlib=libc++ -std=c++11

喜欢没问题,但是 ./test 给我一个段错误。

补充:我的clang版本是:Apple clang version 4.1 (tags/Apple/clang-421.11.66)

最佳答案

R 是用 c 编译器编译的。您不一定需要使用相同的来构建包。所以使用 clang 编译附加包是完全有效的。我在我的 ~/.R/Makevars 文件中使用 clang 和 C++11 进行打包:

CC=clang
CXX=clang++
CXXFLAGS= -stdlib=libc++ -std=c++11

此外,您可能想看看 Rcpp11 ,以 C++11 为中心重新设计的 Rcpp。将 RInside fork 为使用 Rcpp11 而不是 Rcpp 可能不会太难。

关于c++x11 中的 RInside 和 Rcpp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19403869/

相关文章:

r - 查找 R 中匹配元素的数量

c++ - 使用 C++11 原子编写(旋转)线程屏障

c++ - 为什么我默认的移动构造函数不是 noexcept?

c++ - 自定义 Python 构建 - time.so : undefined symbol: PyExc_ValueError

c - 在没有 C 运行时的情况下使用 64 位整数 - 链接错误 __alldiv

r - 为什么 file.exists 尽管位于 list.files 中却返回 FALSE?

R从matriggr管道中的矩阵创建数据帧时给出列名

r - 每月数据的季节性汇总

c++ - std::vector 的 boost::shared_ptr 的内存释放

static - 与 gfortran 和 gcc 静态链接的混合语言