我试图在我的M1 Mac上使用需要在R中使用Rcpp
的软件包,在购买这台计算机后,我从未能够启动和运行。我将其更新到Monterey,希望这将修复一些安装问题,但它没有。我试图从this page运行Rcpp
检查,但我得到以下错误:
> Rcpp::sourceCpp("~/github/helloworld.cpp")
ld: warning: directory not found for option '-L/opt/R/arm64/gfortran/lib/gcc/aarch64-apple-darwin20.2.0/11.0.0'
ld: warning: directory not found for option '-L/opt/R/arm64/gfortran/lib'
ld: library not found for -lgfortran
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [sourceCpp_4.so] Error 1
clang++ -arch arm64 -std=gnu++14 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I../inst/include -I"/Library/Frameworks/R.framework/Versions/4.1-arm64/Resources/library/Rcpp/include" -I"/Library/Frameworks/R.framework/Versions/4.1-arm64/Resources/library/RcppArmadillo/include" -I"/Users/afredston/github" -I/opt/R/arm64/include -fPIC -falign-functions=64 -Wall -g -O2 -c helloworld.cpp -o helloworld.o
clang++ -arch arm64 -std=gnu++14 -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/Library/Frameworks/R.framework/Resources/lib -L/opt/R/arm64/lib -o sourceCpp_4.so helloworld.o -L/Library/Frameworks/R.framework/Resources/lib -lRlapack -L/Library/Frameworks/R.framework/Resources/lib -lRblas -L/opt/R/arm64/gfortran/lib/gcc/aarch64-apple-darwin20.2.0/11.0.0 -L/opt/R/arm64/gfortran/lib -lgfortran -lemutls_w -lm -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation
Error in Rcpp::sourceCpp("~/github/helloworld.cpp") :
Error 1 occurred building shared library.
我知道它不能“找到”gfortran
。我安装了gfortran
的this release用于Monterey。当我在终端中输入which gfortran
时,它返回/opt/homebrew/bin/gfortran
。(也许这个版本的gfortran
需要的Xcode工具太新了,它说的是13.2,当我运行clang --version
时,它说的是13.0,但我不知道。I don’(我没有看到用于Monterey的gfortran
的另一个版本?)
我还在R中将/opt/homebrew/bin:
附加到PATH
,所以现在看起来像这样:
> Sys.getenv("PATH")
[1] "/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Library/TeX/texbin:/Applications/RStudio.app/Contents/MacOS/postback"
我检查的其他东西:
- 安装Xcode命令行工具(
which clang
返回/usr/bin/clang
)。 - 文件
~/.R/Makevars
和~/.Renviron
不存在。
以下是我的会话信息:
R version 4.1.1 (2021-08-10)
Platform: aarch64-apple-darwin20 (64-bit)
Running under: macOS Monterey 12.1
Matrix products: default
LAPACK: /Library/Frameworks/R.framework/Versions/4.1-arm64/Resources/lib/libRlapack.dylib
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] compiler_4.1.1 tools_4.1.1 RcppArmadillo_0.10.7.5.0
[4] Rcpp_1.0.7
3条答案
按热度按时间9rygscc11#
后台
目前(2023-02-20),CRAN使用Xcode 13.1命令行工具中的Apple Clang和GNU Fortran 12的实验分支为Apple芯片构建R 4.2二进制文件。
如果你从CRAN(即here)获得R,那么你需要在构建包含C/C++/Fortran代码的R包之前(以及在使用Rcpp之前)在你的系统上复制CRAN的编译器设置。这个要求确保你的包构建与R本身兼容。
更复杂的是Apple Clang不支持OpenMP,所以你需要做更多的工作来编译使用多线程的程序。你可以通过使用LLVM Clang构建R本身,所有R包和所有外部库来解决这个问题,它 * 确实 * 支持OpenMP,但这种方法是繁重的,“仅供Maven使用”。
有一种another方法已经被一些人测试过,包括Simon Urbanek,他是R for macOS的维护者。它是实验性的,也是“仅供Maven使用”,但它在我的机器上工作,比自己学习构建R和其他库要简单得多。
获取工作工具链说明
sudo
风险自担。*我将尝试同时解决编译器和OpenMP支持问题。我将假设您是从零开始。请随意跳过您已经采取的步骤,尽管您可能会发现重新开始很有帮助。
我已经在运行大苏尔的机器上测试了这些指令,但它们应该也能在 Monterey 和文图拉工作。
1.从CRAN here下载一个R 4.2二进制文件并安装。一定要选择为Apple silicon构建的二进制文件。
1.快跑
在终端中安装最新版本的Apple Xcode命令行工具,其中包括Apple Clang。您可以从浏览器here获得早期版本。但是,您安装的版本不应早于CRAN用于构建R二进制文件的版本。
1.下载here提供的GNU Fortran二进制文件,并通过解包安装到root用户:
最后一个命令更新安装中的符号链接,使其指向命令行工具安装中的SDK。
1.下载一个适用于您的Apple Clang版本here的OpenMP运行时,并通过解包到root安装。您可以使用
clang --version
查询您的Apple Clang版本。例如,我有版本1300.0.29.3,所以我这样做了:解压缩后,您应该在系统上找到以下文件:
1.将以下行添加到
$(HOME)/.R/Makevars
中,如有必要,创建文件。1.测试您是否能够使用R编译带有OpenMP支持的C或C++程序,同时从GNU Fortran安装中链接相关库(由
R CMD CONFIG FLIBS
输出中的-l
标志指示)。最透明的方法是直接使用
R CMD SHLIB
。在临时目录中,创建一个空的源文件omp_test.c
并添加以下行:编译它:
然后从R调用编译后的C函数:
如果编译器或链接器抛出错误,或者如果您发现OpenMP仍然不受支持,那么我们中的一个人犯了错误。请报告任何问题。
请注意,如果您不介意安装,可以使用Rcpp实现相同的测试:
参考文献
一切都有点散乱:
jv4diomz2#
我按照以下说明将gfortran的homebrew安装路径添加到我的
~/.R/Makevars
中,解决了这个问题:https://pat-s.me/transitioning-from-x86-to-arm64-on-macos-experiences-of-an-r-user/#gfortrankgsdhlau3#
在M2 MacBook Pro(macOS Monterey)上测试了以下多线程
data.table
的工作流程用户推断器的步骤与this answer基本相同。
1.从CRAN下载并安装R
1.使用开发人员工具下载并安装RStudio
1.在终端中运行以下命令以安装OpenMP
1.添加编译器标志以连接clan w/ OpenMP。在终端中,编写以下内容:
command+O
然后Enter保存。执行command+X
以关闭编辑器。1.通过从相应的GitHub repo下载
gfortran-ARM-12.1-Monterey.dmg
来下载并运行gfortran的安装程序。这结束了在M2芯片系统下在R中启用OpenMP和(希望如此)Rcpp的步骤。
现在,为了测试
data.table
是否一切正常,我执行了以下操作打开RStudio并运行
如果一切都正确完成,包应该编译没有任何错误,并在运行
getDTthreads(verbose = TRUE)
时返回以下内容: