How to set g++ compiler flags using Rcpp and inline?

有些话、适合烂在心里 提交于 2019-12-04 00:31:42

问题


I want to set -std=c++0x, using Rcpp with inline.

I saw R: C++ Optimization flag when using the inline package but don't want to make a system-wide change, so I was trying option 2 in Dirk's answer.

I tried:

settings=getPlugin("Rcpp")
settings$Makevars[length(settings$Makevars)+1] = "CXXFLAGS = $(CXXFLAGS) -std=c++0x"
fun=cxxfunction(signature(x_ ="numeric"),src,plugin="Rcpp",settings=settings,verbose=2);

But the verbose output shows it is ignoring that. I also tried with CFLAGS, and without including existing value, but no effect.


回答1:


After some source code study, and a hint from Dirk Eddelbuettel, I've worked this out:

settings$env$PKG_CXXFLAGS='-std=c++0x'

You can set PKG_CPPFLAGS the same way.

Here is a complete and more robust example:

library(inline)

src='
using namespace Rcpp;
std::vector<const char*> test={"Hello","World","!!!"};
return wrap(test);
'

settings=getPlugin("Rcpp")
settings$env$PKG_CXXFLAGS=paste('-std=c++0x',settings$env$PKG_CXXFLAGS,sep=' ')
fun=cxxfunction(signature(),src,plugin="Rcpp",settings=settings)

Sys.unsetenv('PKG_CXXFLAGS')

print(fun())

The paste() makes sure if there were any settings already in the plugin then they are preserved.

The unsetenv() is something cxxfunction should already be doing (IMHO). Currently it will add variables to the environment, but not remove them after. So, without the unsetenv() call, if you later ran cxxfunction again, but with all defaults, any CXXFLAGS you had earlier set would get used. This might not matter, or it might give surprising results. (Imagine if your were using PKG_CXXFLAGS to set -Wall -Werror for your own code, but later code links to a 3rd party library and refuses to compile with those options.)



来源:https://stackoverflow.com/questions/7063265/how-to-set-g-compiler-flags-using-rcpp-and-inline

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!