2013-10-16 23 views
3

我想在C++ x11代码中使用RInside来调用R例程。默认情况下,R似乎安装了库的C++ 98版本,因此链接不成功。我想知道我应该如何安装C++ x11版本的RInside(但是我想我需要重新编译所有R/R软件包,是否?)以及是否存在一些更简单的解决方案。在此先感谢(我在MacOS工作)Renside和Rcpp在C++ x11

更新: 我重新安装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 

然后我使用编译Hello World示例(没有CX11):

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! 

Howev呃,加入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给我一个seg故障。

加:我铿锵的版本是:苹果铛版本4.1(标签/苹果/铛-421.11.66)

+0

我想说,如果你的程序在最简单的例子中饱受折磨,那么你并没有“成功”建立图书馆。也没有必要重新印刷多年来一直在RInside回购和分销的源代码。 –

回答

3

R是一个C编译器来编译。你不一定需要使用它来构建包。因此,使用clang编译添加包是完全有效的。我有这个在我的~/.R/Makevars文件中使用铛和C++包11:

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

此外,你可能想看看Rcpp11,RCPP的C++ 11为中心的重新设计。这可能不会太难,可以让RInside使用Rcpp11代替Rcpp。

0

我不知道不同的链接器要求。你有什么应该工作。否则,请显示您的实际链接步骤和错误,最好以我可以在我的最后看到的可重现的方式。

见证以下内容。我们首先建立与默认的标志:

[email protected]:~/svn/rinside/pkg/inst/examples/standard$ grep ^CXXFLAGS ~/.R/Makevars 
CXXFLAGS=    -g -O3 -Wall -pipe -Wno-unused -pedantic # plain C++ 
[email protected]:~/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 
[email protected]:~/svn/rinside/pkg/inst/examples/standard$ ./rinside_sample0 
Hello, world!  
[email protected]:~/svn/rinside/pkg/inst/examples/standard$ 

现在我简单地增加-std=c++11CXXFLAGS

[email protected]:~/svn/rinside/pkg/inst/examples/standard$ grep ^CXXFLAGS ~/.R/Makevars 
CXXFLAGS=    -g -O3 -Wall -pipe -Wno-unused -pedantic -std=c++11 
[email protected]:~/svn/rinside/pkg/inst/examples/standard$ 

和改造二进制:

[email protected]:~/svn/rinside/pkg/inst/examples/standard$ rm rinside_sample0 
[email protected]:~/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 
[email protected]:~/svn/rinside/pkg/inst/examples/standard$ ./rinside_sample0  
Hello, world!   
[email protected]:~/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的编译器部署它们。

+0

对不起,我有点失落。你是否建议我不需要重新编译RInside和Rcpp? – user1835313

+0

这就是我刚刚演示的例子。 –

+0

谢谢你的帮助。请参阅我的编辑。 – user1835313