c+中的冲洗液和Rcpp+;x11

c+中的冲洗液和Rcpp+;x11,r,c++11,linker,rcpp,rinside,R,C++11,Linker,Rcpp,Rinside,我想在c++x11代码中使用RInside调用R例程。默认情况下,R似乎安装了c++98版本的库,因此链接不会成功。我想知道在安装c++x11版本的RInside时应该执行哪些不同的步骤(但我想我需要重新编译所有的R/R包,是吗?)以及是否存在更简单的解决方案。提前感谢(我在MacOs上工作) 更新: 我重新安装了Rcpp和RInside DO(我的Makevars是空的,所以c++98版本) 然后,我使用(无cx11)编译hello world示例: 这就产生了我: Hello, worl

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

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

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

这就产生了我:

  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
我得到(链接时):

喜欢是可以的,但是/测试给了我一个seg错误


添加:我的clang版本是:Apple clang版本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

另外,您可能想看看以C++11为中心的Rcpp重新设计。使用Rcpp11代替Rcpp可能不会太难

我不知道不同的链接器要求。你所拥有的应该是有用的。否则,请显示您的实际链接步骤和错误,最好是在一个可复制的方式,我可以在我的最后看

请看下面的例子。我们首先使用默认标志构建:

edd@max:~/svn/rinside/pkg/inst/examples/standard$ grep ^CXXFLAGS ~/.R/Makevars
CXXFLAGS=             -g -O3 -Wall -pipe -Wno-unused -pedantic    # plain C++ 
edd@max:~/svn/rinside/pkg/inst/examples/standard$ make rinside_sample0
ccache g++-4.7 -I/usr/share/R/include \
  -I/usr/local/lib/R/site-library/Rcpp/include \
  -I/usr/local/lib/R/site-library/RInside/include -g -O3 -Wall \
  -pipe -Wno-unused -pedantic -Wall   \
  rinside_sample0.cpp  -L/usr/lib/R/lib -lR  -lblas \
  -llapack -L/usr/local/lib/R/site-library/Rcpp/lib -lRcpp \
  -Wl,-rpath,/usr/local/lib/R/site-library/Rcpp/lib \
  -L/usr/local/lib/R/site-library/RInside/lib \
  -lRInside -Wl,-rpath,/usr/local/lib/R/site-library/RInside/lib \
  -o rinside_sample0
edd@max:~/svn/rinside/pkg/inst/examples/standard$ ./rinside_sample0 
Hello, world!       
edd@max:~/svn/rinside/pkg/inst/examples/standard$ 
现在我只是简单地将
-std=c++11
添加到我的
CXXFLAGS

edd@max:~/svn/rinside/pkg/inst/examples/standard$ grep ^CXXFLAGS ~/.R/Makevars 
CXXFLAGS=             -g -O3 -Wall -pipe -Wno-unused -pedantic -std=c++11
edd@max:~/svn/rinside/pkg/inst/examples/standard$  
并重新制作二进制文件:

edd@max:~/svn/rinside/pkg/inst/examples/standard$ rm rinside_sample0  
edd@max:~/svn/rinside/pkg/inst/examples/standard$ make rinside_sample0
ccache g++-4.7 -I/usr/share/R/include \
 -I/usr/local/lib/R/site-library/Rcpp/include \
 -I/usr/local/lib/R/site-library/RInside/include \
 -g -O3 -Wall -pipe -Wno-unused \
 -pedantic -std=c++11 -Wall  \
  rinside_sample0.cpp  -L/usr/lib/R/lib -lR \
 -lblas -llapack -L/usr/local/lib/R/site-library/Rcpp/lib -lRcpp \
 -Wl,-rpath,/usr/local/lib/R/site-library/Rcpp/lib \
 -L/usr/local/lib/R/site-library/RInside/lib \
 -lRInside -Wl,-rpath,/usr/local/lib/R/site-library/RInside/lib \
 -o rinside_sample0 
edd@max:~/svn/rinside/pkg/inst/examples/standard$ ./rinside_sample0    
Hello, world!        
edd@max:~/svn/rinside/pkg/inst/examples/standard$  
要部署C++11,您不需要新的编译器或项目

只需在编译器标志中添加一个选项,就很容易了

为了让它更简单,我们还可以将这三行添加到
rinside_sample0.cpp
中,使其成为一个C++11程序:

auto magic = 42;                    // C++11 
R["magic"] = magic;                    
R.parseEvalQ("print(magic)");     

并且(使用所需的
-std=c++11
标志)它也构建和运行完全不需要在Rcpp或RInside端进行任何更改即可使用支持C++11的编译器部署它们。

如果您的程序在最简单的示例中失败,我会说您没有“成功”构建库。也没有必要重新打印源代码,这些源代码已经在RInside repo和发行版中发布了很多年。很抱歉,我有点迷路了。您是否建议我不需要重新编译RInside和Rcpp?这就是我的示例刚才演示的内容。Rcpp 0.10.4是一个较旧的版本。试试最新的。在不做任何修改的情况下尝试所有操作,以证明您的系统没有安装软管。然后加入修改。rcpp-devel列表可能会帮助您,因为有相当多的OS X用户。很可能会与一个新的
clang++
交互——我们为CRAN发布了rcpp/Rinside,它通过了CRAN测试的所有(合理的)系统和操作系统(除了无人使用的Solaris之外,没有人可以帮助我们进行补丁)。这包括OSX。你使用它超出了那些规格;正如我所展示的,它仍然可以在我的系统上运行,我没有访问像您这样的系统。选择较新的版本并不会删除“架构x86_64的未定义符号”。我不明白为什么我需要重新编译Rcpp和RInside以获得兼容的版本,而您不需要它。
edd@max:~/svn/rinside/pkg/inst/examples/standard$ grep ^CXXFLAGS ~/.R/Makevars
CXXFLAGS=             -g -O3 -Wall -pipe -Wno-unused -pedantic    # plain C++ 
edd@max:~/svn/rinside/pkg/inst/examples/standard$ make rinside_sample0
ccache g++-4.7 -I/usr/share/R/include \
  -I/usr/local/lib/R/site-library/Rcpp/include \
  -I/usr/local/lib/R/site-library/RInside/include -g -O3 -Wall \
  -pipe -Wno-unused -pedantic -Wall   \
  rinside_sample0.cpp  -L/usr/lib/R/lib -lR  -lblas \
  -llapack -L/usr/local/lib/R/site-library/Rcpp/lib -lRcpp \
  -Wl,-rpath,/usr/local/lib/R/site-library/Rcpp/lib \
  -L/usr/local/lib/R/site-library/RInside/lib \
  -lRInside -Wl,-rpath,/usr/local/lib/R/site-library/RInside/lib \
  -o rinside_sample0
edd@max:~/svn/rinside/pkg/inst/examples/standard$ ./rinside_sample0 
Hello, world!       
edd@max:~/svn/rinside/pkg/inst/examples/standard$ 
edd@max:~/svn/rinside/pkg/inst/examples/standard$ grep ^CXXFLAGS ~/.R/Makevars 
CXXFLAGS=             -g -O3 -Wall -pipe -Wno-unused -pedantic -std=c++11
edd@max:~/svn/rinside/pkg/inst/examples/standard$  
edd@max:~/svn/rinside/pkg/inst/examples/standard$ rm rinside_sample0  
edd@max:~/svn/rinside/pkg/inst/examples/standard$ make rinside_sample0
ccache g++-4.7 -I/usr/share/R/include \
 -I/usr/local/lib/R/site-library/Rcpp/include \
 -I/usr/local/lib/R/site-library/RInside/include \
 -g -O3 -Wall -pipe -Wno-unused \
 -pedantic -std=c++11 -Wall  \
  rinside_sample0.cpp  -L/usr/lib/R/lib -lR \
 -lblas -llapack -L/usr/local/lib/R/site-library/Rcpp/lib -lRcpp \
 -Wl,-rpath,/usr/local/lib/R/site-library/Rcpp/lib \
 -L/usr/local/lib/R/site-library/RInside/lib \
 -lRInside -Wl,-rpath,/usr/local/lib/R/site-library/RInside/lib \
 -o rinside_sample0 
edd@max:~/svn/rinside/pkg/inst/examples/standard$ ./rinside_sample0    
Hello, world!        
edd@max:~/svn/rinside/pkg/inst/examples/standard$  
auto magic = 42;                    // C++11 
R["magic"] = magic;                    
R.parseEvalQ("print(magic)");