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