You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Mac OS下如何让Makefile使用g++而非clang++编译R包C++库

解决Mac上R包编译时用g替代clang的问题

我之前在Mac上编译依赖g的R包时也踩过这个坑——Mac默认把g++映射成了clang,所以直接指定CXX=g++根本没用,给你几个亲测有效的方案:

方案1:修改包内的src/Makevars文件

直接在你的R包的src目录下创建或编辑Makevars文件,明确指定编译器和编译参数:

# 指定你安装的g++版本(比如通过Homebrew装的gcc 13就是g++-13)
CXX = g++-13
# 把你Linux上的编译参数搬过来,按需调整路径
CXXFLAGS = -std=c++11 -I/usr/share/R/include -DNDEBUG -I../inst/include/ -I"/usr/local/lib/R/site-library/Rcpp/include" -fpic -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g

注意:Mac上Rcpp的路径可能和Linux不一样,你可以用Rscript -e 'Rcpp:::CxxFlags()'查看正确的include路径。

方案2:修改全局的~/.R/Makevars

如果希望所有R包编译都用g++,可以修改用户目录下的~/.R/Makevars(没有就新建一个):

# 全局设置C++编译器
CXX = g++-13
CXXFLAGS = -std=c++11 -fpic -g -O2
# 针对R包编译的额外设置
SHLIB_CXXFLAGS = $(CXXFLAGS)

这种方式一劳永逸,不用每个包都改Makevars。

方案3:临时通过环境变量指定

如果只是临时编译某个包,可以在终端里设置环境变量后再执行安装:

# 先确认g++版本,比如g++-13
export CXX=g++-13
# 然后安装你的包
R CMD INSTALL your_package_name

或者直接合并成一行:

CXX=g++-13 R CMD INSTALL your_package_name

关键注意事项

  • 首先得确保Mac上已经安装了gcc(包含g++):用Homebrew安装brew install gcc,安装后会生成g++-X(X是版本号)的可执行文件,用which g++-13确认路径是否存在。
  • 不要直接写CXX=g++!Mac默认的/usr/bin/g++是clang++的别名,必须写带版本号的g++-X
  • 编译时可以观察输出的命令行,确认是不是用了你指定的g++,比如有没有出现g++-13 -std=c++11 ...的字样,这样能快速验证是否生效。

内容的提问来源于stack exchange,提问作者ShanZhengYang

火山引擎 最新活动