如何在Mac OS(M2 Pro+Sonoma)中为R包mgcv启用OpenMP?
解决Apple M2 Pro(Sonoma 14.1.1)上mgcv源码安装时OpenMP的omp.h找不到问题
问题背景
在搭载Sonoma 14.1.1的Apple M2 Pro设备上,尝试从源码安装R包mgcv以启用GAMMs的多线程计算,但编译时出现fatal error: 'omp.h' file not found错误。已通过Homebrew安装libomp,但现有Makevars配置未生效。
当前Makevars配置
FLIBS =-L/opt/homebrew/opt/gfortran/lib F77 = /opt/homebrew/bin/gfortran FC = /opt/homebrew/bin/gfortran CFLAGS = -I/opt/homebrew/include CPPFLAGS = -I/opt/homebrew/include CXXFLAGS = -I/opt/homebrew/include LDFLAGS += -L/opt/homebrew/opt/libomp/lib -lomp CPPFLAGS += -Xclang -fopenmp
编译错误日志
> install.packages("mgcv", type = "source") trying URL 'https://cran.rstudio.com/src/contrib/mgcv_1.9-1.tar.gz' Content type 'application/x-gzip' length 1083217 bytes (1.0 MB) ================================================== downloaded 1.0 MB * installing *source* package ‘mgcv’ ... ** package ‘mgcv’ successfully unpacked and MD5 sums checked ** using staged installation ** libs using C compiler: ‘Apple clang version 15.0.0 (clang-1500.1.0.2.5)’ using SDK: ‘MacOSX14.2.sdk’ clang -arch arm64 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I/opt/homebrew/include -Xclang -fopenmp -fPIC -I/opt/homebrew/include -c coxph.c -o coxph.o clang -arch arm64 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I/opt/homebrew/include -Xclang -fopenmp -fPIC -I/opt/homebrew/include -c davies.c -o davies.o clang -arch arm64 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I/opt/homebrew/include -Xclang -fopenmp -fPIC -I/opt/homebrew/include -c discrete.c -o discrete.o discrete.c:26:10: fatal error: 'omp.h' file not found #include <omp.h> ^~~~~~~ 1 error generated. make: *** [discrete.o] Error 1 ERROR: compilation failed for package ‘mgcv’ * removing ‘/Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/library/mgcv’ Warning in install.packages : installation of package ‘mgcv’ had non-zero exit status The downloaded source packages are in ‘/private/var/folders/lm/67l59t7s7qb61nx7mc1b6lsh0000gn/T/Rtmp0qj8PW/downloaded_packages’
解决步骤
1. 修正Makevars的头文件与编译选项
Homebrew安装的libomp有独立的头文件路径,且Apple clang需要为C/C++文件分别启用OpenMP选项。修改~/.R/Makevars(如果没有则创建)为以下内容:
FLIBS =-L/opt/homebrew/opt/gfortran/lib F77 = /opt/homebrew/bin/gfortran FC = /opt/homebrew/bin/gfortran # 指定libomp专属头文件路径,同时为C/C++启用OpenMP CFLAGS = -I/opt/homebrew/include -I/opt/homebrew/opt/libomp/include -Xclang -fopenmp CPPFLAGS = -I/opt/homebrew/include -I/opt/homebrew/opt/libomp/include -Xclang -fopenmp CXXFLAGS = -I/opt/homebrew/include -I/opt/homebrew/opt/libomp/include -Xclang -fopenmp # 链接libomp库 LDFLAGS += -L/opt/homebrew/opt/libomp/lib -lomp
2. 重新安装mgcv
关闭所有R会话,打开新的R终端执行:
install.packages("mgcv", type = "source")
3. 验证多线程是否启用
安装完成后运行以下代码检查:
library(mgcv) cat("可用OpenMP线程数:", mgcv:::omp_get_max_threads(), "\n")
输出大于1即表示多线程已成功启用。
问题原因说明
- 头文件路径缺失:Homebrew的libomp头文件不在通用的
/opt/homebrew/include下,而是在/opt/homebrew/opt/libomp/include,之前的配置未指定这个路径,导致编译器找不到omp.h。 - 编译选项不完整:之前仅在CPPFLAGS中添加了OpenMP选项,但C文件(如
discrete.c)使用CFLAGS编译,未启用OpenMP,同样会触发头文件找不到的错误。
内容的提问来源于stack exchange,提问作者shanananthi
相关产品推荐
相关产品推荐

