You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 16:05:08