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




