MacOS Monterey更新Xcode/RStudio后Rcpp无法source C++文件报错
问题描述
- 运行环境:搭载Intel芯片的MacOS Monterey系统
- 触发场景:更新Xcode、RStudio等软件后,Rcpp无法正常加载、编译C++文件,参考公开渠道同类问题的排查方案逐一操作后问题仍未解决
- 编译阶段抛出的完整报错信息如下:
In file included from file1851d7b0603f9.cpp:1: In file included from /Library/Frameworks/R.framework/Versions/4.1/Resources/library/Rcpp/include/Rcpp.h:27: In file included from /Library/Frameworks/R.framework/Versions/4.1/Resources/library/Rcpp/include/RcppCommon.h:30: In file included from /Library/Frameworks/R.framework/Versions/4.1/Resources/library/Rcpp/include/Rcpp/r/headers.h:62: In file included from /Library/Frameworks/R.framework/Versions/4.1/Resources/library/Rcpp/include/Rcpp/platform/compiler.h:100: /usr/local/opt/llvm/bin/../include/c++/v1/cmath:642:26: error: no template named 'numeric_limits' bool _FloatBigger = (numeric_limits<_FloatT>::digits > numeric_limits<_IntT>::digits), ^ /usr/local/opt/llvm/bin/../include/c++/v1/cmath:642:60: error: no template named 'numeric_limits' bool _FloatBigger = (numeric_limits<_FloatT>::digits > numeric_limits<_IntT>::digits), ^ /usr/local/opt/llvm/bin/../include/c++/v1/cmath:643:18: error: no template named 'numeric_limits' int _Bits = (numeric_limits<_IntT>::digits - numeric_limits<_FloatT>::digits)> ^ /usr/local/opt/llvm/bin/../include/c++/v1/cmath:643:50: error: no template named 'numeric_limits' int _Bits = (numeric_limits<_IntT>::digits - numeric_limits<_FloatT>::digits)> ^ /usr/local/opt/llvm/bin/../include/c++/v1/cmath:648:17: error: no template named 'numeric_limits' static_assert(numeric_limits<_FloatT>::radix == 2, "FloatT has incorrect radix"); ^ /usr/local/opt/llvm/bin/../include/c++/v1/cmath:651:25: error: no template named 'numeric_limits' return _FloatBigger ? numeric_limits<_IntT>::max() : (numeric_limits<_IntT>::max() >> _Bits << _Bits); ^ /usr/local/opt/llvm/bin/../include/c++/v1/cmath:651:58: error: no template named 'numeric_limits' return _FloatBigger ? numeric_limits<_IntT>::max() : (numeric_limits<_IntT>::max() >> _Bits << _Bits); ^ /usr/local/opt/llvm/bin/../include/c++/v1/cmath:661:16: error: no template named 'numeric_limits' using _Lim = numeric_limits<_IntT>; ^ /usr/local/opt/llvm/bin/../include/c++/v1/cmath:664:12: error: use of undeclared identifier '_Lim' return _Lim::max(); ^ /usr/local/opt/llvm/bin/../include/c++/v1/cmath:665:21: error: use of undeclared identifier '_Lim' } else if (__r <= _Lim::lowest()) { ^ /usr/local/opt/llvm/bin/../include/c++/v1/cmath:666:12: error: use of undeclared identifier '_Lim' return _Lim::min(); ^ In file included from file1851d7b0603f9.cpp:1: In file included from /Library/Frameworks/R.framework/Versions/4.1/Resources/library/Rcpp/include/Rcpp.h:27: In file included from /Library/Frameworks/R.framework/Versions/4.1/Resources/library/Rcpp/include/RcppCommon.h:30: In file included from /Library/Frameworks/R.framework/Versions/4.1/Resources/library/Rcpp/include/Rcpp/r/headers.h:62: In file included from /Library/Frameworks/R.framework/Versions/4.1/Resources/library/Rcpp/include/Rcpp/platform/compiler.h:153: In file included from /usr/local/opt/llvm/bin/../include/c++/v1/unordered_map:437: In file included from /usr/local/opt/llvm/bin/../include/c++/v1/__hash_table:16: In file included from /usr/local/opt/llvm/bin/../include/c++/v1/algorithm:653: In file included from /usr/local/opt/llvm/bin/../include/c++/v1/functional:490: In file included from /usr/local/opt/llvm/bin/../include/c++/v1/__algorithm/search.h:15: In file included from /usr/local/opt/llvm/bin/../include/c++/v1/__iterator/iterator_traits.h:14: In file included from /usr/local/opt/llvm/bin/../include/c++/v1/__iterator/incrementable_traits.h:14: In file included from /usr/local/opt/llvm/bin/../include/c++/v1/concepts:134: In file included from /usr/local/opt/llvm/bin/../include/c++/v1/__functional_base:22: In file included from /usr/local/opt/llvm/bin/../include/c++/v1/exception:83: /usr/local/opt/llvm/bin/../include/c++/v1/cstdlib:138:9: error: target of using declaration conflicts with declaration already in scope using ::abs _LIBCPP_USING_IF_EXISTS; ^ /usr/local/include/stdlib.h:132:6: note: target of using declaration int abs(int) __pure2; ^ /usr/local/opt/llvm/bin/../include/c++/v1/cmath:338:1: note: conflicting declaration using ::abs _LIBCPP_USING_IF_EXISTS; ^ In file included from file1851d7b0603f9.cpp:1: In file included from /Library/Frameworks/R.framework/Versions/4.1/Resources/library/Rcpp/include/Rcpp.h:27: In file included from /Library/Frameworks/R.framework/Versions/4.1/Resources/library/Rcpp/include/RcppCommon.h:65: /usr/local/opt/llvm/bin/../include/c++/v1/complex:853:1: error: declaration conflicts with target of using declaration already in scope abs(const complex<_Tp>& __c) ^ /usr/local/opt/llvm/bin/../include/c++/v1/cmath:338:1: note: target of using declaration using ::abs _LIBCPP_USING_IF_EXISTS; ^ /usr/local/opt/llvm/bin/../include/c++/v1/cmath:338:9: note: using declaration using ::abs _LIBCPP_USING_IF_EXISTS; ^ In file included from file1851d7b0603f9.cpp:1: In file included from /Library/Frameworks/R.framework/Versions/4.1/Resources/library/Rcpp/include/Rcpp.h:27: In file included from /Library/Frameworks/R.framework/Versions/4.1/Resources/library/Rcpp/include/RcppCommon.h:65: /usr/local/opt/llvm/bin/../include/c++/v1/complex:910:16: error: reference to unresolved using declaration return abs(__c.real()); ^ /usr/local/opt/llvm/bin/../include/c++/v1/cmath:338:1: note: using declaration annotated with 'using_if_exists' here using ::abs _LIBCPP_USING_IF_EXISTS; ^ In file included from file1851d7b0603f9.cpp:1: In file included from /Library/Frameworks/R.framework/Versions/4.1/Resources/library/Rcpp/include/Rcpp.h:27: In file included from /Library/Frameworks/R.framework/Versions/4.1/Resources/library/Rcpp/include/RcppCommon.h:65: /usr/local/opt/llvm/bin/../include/c++/v1/complex:912:16: error: reference to unresolved using declaration return abs(__c.imag()); ^ /usr/local/opt/llvm/bin/../include/c++/v1/cmath:338:1: note: using declaration annotated with 'using_if_exists' here using ::abs _LIBCPP_USING_IF_EXISTS; ^ In file included from file1851d7b0603f9.cpp:1: In file included from /Library/Frameworks/R.framework/Versions/4.1/Resources/library/Rcpp/include/Rcpp.h:27: In file included from /Library/Frameworks/R.framework/Versions/4.1/Resources/library/Rcpp/include/RcppCommon.h:65: /usr/local/opt/llvm/bin/../include/c++/v1/complex:969:16: error: reference to unresolved using declaration __re = abs(__re); ^ /usr/local/opt/llvm/bin/../include/c++/v1/cmath:338:1: note: using declaration annotated with 'using_if_exists' here using ::abs _LIBCPP_USING_IF_EXISTS; ^ In file included from file1851d7b0603f9.cpp:1: In file included from /Library/Frameworks/R.framework/Versions/4.1/Resources/library/Rcpp/include/Rcpp.h:27: In file included from /Library/Frameworks/R.framework/Versions/4.1/Resources/library/Rcpp/include/RcppCommon.h:65: /usr/local/opt/llvm/bin/../include/c++/v1/complex:1022:29: error: reference to unresolved using declaration return complex<_Tp>(log(abs(__x)), arg(__x)); ^ /usr/local/opt/llvm/bin/../include/c++/v1/cmath:338:1: note: using declaration annotated with 'using_if_exists' here using ::abs _LIBCPP_USING_IF_EXISTS; ^ In file included from file1851d7b0603f9.cpp:1: In file included from /Library/Frameworks/R.framework/Versions/4.1/Resources/library/Rcpp/include/Rcpp.h:27: In file included from /Library/Frameworks/R.framework/Versions/4.1/Resources/library/Rcpp/include/RcppCommon.h:65: /usr/local/opt/llvm/bin/../include/c++/v1/complex:1049:23: error: reference to unresolved using declaration return polar(sqrt(abs(__x)), arg(__x) / _Tp(2)); ^ /usr/local/opt/llvm/bin/../include/c++/v1/cmath:338:1: note: using declaration annotated with 'using_if_exists' here using ::abs _LIBCPP_USING_IF_EXISTS; ^ In file included from file1851d7b0603f9.cpp:1: In file included from /Library/Frameworks/R.framework/Versions/4.1/Resources/library/Rcpp/include/Rcpp.h:27: In file included from /Library/Frameworks/R.framework/Versions/4.1/Resources/library/Rcpp/include/RcppCommon.h:65: /usr/local/opt/llvm/bin/../include/c++/v1/complex:1174:33: error: reference to unresolved using declaration return complex<_Tp>(abs(__x.real()), __x.imag()); ^ /usr/local/opt/llvm/bin/../include/c++/v1/cmath:338:1: note: using declaration annotated with 'using_if_exists' here using ::abs _LIBCPP_USING_IF_EXISTS; ^ fatal error: too many errors emitted, stopping now [-ferror-limit=] 20 errors generated. make: *** [file1851d7b0603f9.o] Error 1 /usr/local/opt/llvm/bin/clang++ -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I"/Library/Frameworks/R.framework/Versions/4.1/Resources/library/Rcpp/include" -I"/private/var/folders/pq/hxwd9my563q_qpy4rbrlgkmw0000gn/T/RtmpYPQ7or/sourceCpp-x86_64-apple-darwin17.0-1.0.8.3" -I/usr/local/include -fPIC -I/usr/local/opt/llvm/include -c file1851d7b0603f9.cpp -o file1851d7b0603f9.o Error in sourceCpp(code = code, env = env, rebuild = rebuild, cacheDir = cacheDir, : Error 1 occurred building shared library.
故障原因
- 从编译日志可见,当前R调用的是Homebrew安装的LLVM clang++编译器(路径为
/usr/local/opt/llvm/bin/clang++),Xcode更新后系统编译工具链、Homebrew版LLVM、R的编译配置三者出现头文件搜索路径不匹配问题:- LLVM自带libc++标准库未正确加载
<limits>头文件,导致numeric_limits模板无法识别 - 系统C标准库
stdlib.h的abs函数声明和LLVM libc++的abs声明出现作用域冲突,触发连锁编译错误
- LLVM自带libc++标准库未正确加载
修复步骤
- 重置Xcode命令行工具路径,打开终端依次执行以下命令:
正常输出路径应为sudo xcode-select --reset xcode-select -p/Library/Developer/CommandLineTools或/Applications/Xcode.app/Contents/Developer,如果路径异常,手动执行命令指定:sudo xcode-select -s /Applications/Xcode.app/Contents/Developer - 修改R的编译配置文件,找到
~/.R/Makevars文件(路径不存在则手动新建),注释或删除所有强制指定Homebrew LLVM路径的配置项,替换为以下内容:
不要强行指定Homebrew版LLVM作为R的编译工具,系统自带clang++和Xcode命令行工具的适配性最高,不会出现头文件冲突问题。CXX=/usr/bin/clang++ CXX11=/usr/bin/clang++ CXX14=/usr/bin/clang++ CXX17=/usr/bin/clang++ CXXFLAGS=-Wall -O2 -mtune=native - 重新安装Xcode命令行工具,终端执行:
按照弹窗引导完成安装后重启电脑。sudo rm -rf /Library/Developer/CommandLineTools xcode-select --install - 重启后打开R/RStudio,重新安装Rcpp相关包,清除历史编译缓存:
remove.packages(c("Rcpp", "RcppArmadillo")) install.packages(c("Rcpp", "RcppArmadillo"), type = "source") - 执行测试命令
Rcpp::evalCpp("1+1"),如果返回结果为2,说明编译功能恢复正常。
内容的提问来源于stack exchange,提问作者Caffé Sospeso
相关产品推荐
相关产品推荐

