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

macOS下编译MASS 7.3-54版本出现编译错误求助

在macOS 11.7.7 + R 4.1.2环境编译安装MASS 7.3-54失败的问题

我正尝试在macOS 11.7.7系统的R 4.1.2环境中编译安装MASS 7.3-54包,用于恢复renv环境。原以为问题出在clang版本过旧(原本约为12.5),但卸载并重装Xcode命令行工具后仍未解决问题。

编译错误日志

* installing *source* package ‘MASS’ ...
** package ‘MASS’ successfully unpacked and MD5 sums checked
** using staged installation
** libs
using C compiler: ‘Apple clang version 13.0.0 (clang-1300.0.29.30)’
using SDK: ‘MacOSX12.1.sdk’
clang -arch x86_64 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG   -I/opt/R/x86_64/include    -fPIC  -falign-functions=64 -Wall -g -O2  -c MASS.c -o MASS.o
MASS.c:37:23: error: unknown type name 'Sint'; did you mean 'int'?
VR_sammon(double *dd, Sint *nn, Sint *kd, double *Y, Sint *niter,
                      ^~~~
                      int
MASS.c:37:33: error: unknown type name 'Sint'; did you mean 'int'?
VR_sammon(double *dd, Sint *nn, Sint *kd, double *Y, Sint *niter,
                                ^~~~
                                int
MASS.c:37:54: error: unknown type name 'Sint'; did you mean 'int'?
VR_sammon(double *dd, Sint *nn, Sint *kd, double *Y, Sint *niter,
                                                     ^~~~
                                                     int
MASS.c:38:20: error: unknown type name 'Sint'; did you mean 'int'?
          double *stress, Sint *trace, double *aa, double *tol)
                          ^~~~
                          int
MASS.c:168:8: error: unknown type name 'Sint'; did you mean 'int'?
static Sint *ord;               /* 相异度的秩 */
       ^~~~
       int
MASS.c:169:8: error: unknown type name 'Sint'; did you mean 'int'?
static Sint *ord2;              /* 逆序(第i个秩对应的元素是哪个?) */
       ^~~~
       int
MASS.c:170:8: error: unknown type name 'Sint'; did you mean 'int'?
static Sint n;                  /* 相异度的数量 */
       ^~~~
       int
MASS.c:171:8: error: unknown type name 'Sint'; did you mean 'int'?
static Sint nr;                 /* 数据点的数量 */
       ^~~~
       int
MASS.c:172:8: error: unknown type name 'Sint'; did you mean 'int'?
static Sint nc;                 /* 拟合配置的列数 */
       ^~~~
       int
MASS.c:181:31: error: unknown type name 'Sint'; did you mean 'int'?
VR_mds_fn(double *, double *, Sint *, double *, Sint *,
                              ^~~~
                              int
MASS.c:181:49: error: unknown type name 'Sint'; did you mean 'int'?
VR_mds_fn(double *, double *, Sint *, double *, Sint *,
                                                ^~~~
                                                int
MASS.c:182:14: error: unknown type name 'Sint'; did you mean 'int'?
          double *, Sint *, Sint *, double *, Sint *, double *);
                    ^~~~
                    int
MASS.c:182:22: error: unknown type name 'Sint'; did you mean 'int'?
          double *, Sint *, Sint *, double *, Sint *, double *);
                            ^~~~
                            int
MASS.c:182:40: error: unknown type name 'Sint'; did you mean 'int'?
          double *, Sint *, Sint *, double *, Sint *, double *);
                                              ^~~~
                                              int
MASS.c:188:18: error: unknown type name 'Sint'; did you mean 'int'?
VR_mds_init_data(Sint *pn, Sint *pc, Sint *pr, Sint *orde,
                 ^~~~
                 int
MASS.c:188:28: error: unknown type name 'Sint'; did you mean 'int'?
VR_mds_init_data(Sint *pn, Sint *pc, Sint *pr, Sint *orde,
                           ^~~~
                           int
MASS.c:188:38: error: unknown type name 'Sint'; did you mean 'int'?
VR_mds_init_data(Sint *pn, Sint *pc, Sint *pr, Sint *orde,
                                     ^~~~
                                     int
MASS.c:188:48: error: unknown type name 'Sint'; did you mean 'int'?
VR_mds_init_data(Sint *pn, Sint *pc, Sint *pr, Sint *orde,
                                               ^~~~
                                               int
MASS.c:189:4: error: unknown type name 'Sint'; did you mean 'int'?
                 Sint *ordee, double *xx, double *p)
                 ^~~~
                 int
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
make: *** [MASS.o] Error 1
ERROR: compilation failed for package ‘MASS’

解决方法

1. 确认R头文件路径有效性

报错中的Sint是R定义的整数类型,正常会在R的头文件中被定义为typedef int Sint;。需确保编译时clang能正确读取R的头文件:

  • 执行echo $R_INCLUDE_DIR,检查输出是否为/Library/Frameworks/R.framework/Resources/include
  • 若路径错误,编译前设置环境变量:export R_INCLUDE_DIR="/Library/Frameworks/R.framework/Resources/include"

2. 直接安装预编译二进制包

源码编译失败时,优先安装对应R版本的预编译包:

install.packages("MASS", version = "7.3-54", type = "binary")

如果是renv环境,直接指定二进制类型安装:

renv::install("MASS@7.3-54", type = "binary")

3. 匹配系统SDK版本

当前使用的MacOSX12.1.sdk与你的macOS 11.7.7系统版本不匹配,可能导致头文件解析异常:

  • 查看本地可用SDK:ls /Library/Developer/CommandLineTools/SDKs/
  • 设置环境变量指定对应SDK:export SDKROOT="/Library/Developer/CommandLineTools/SDKs/MacOSX11.sdk"
  • 重新尝试源码编译:install.packages("MASS", version = "7.3-54", type = "source")

4. 手动修改源码类型定义

若以上方法无效,可直接修改MASS源码中的Sint为int:

  1. 下载源码包:wget https://cran.r-project.org/src/contrib/Archive/MASS/MASS_7.3-54.tar.gz
  2. 解压:tar -xzf MASS_7.3-54.tar.gz
  3. 进入目录,将MASS.c中所有Sint替换为int
  4. 重新打包:tar -czf MASS_7.3-54_modified.tar.gz MASS
  5. 安装修改后的包:install.packages("MASS_7.3-54_modified.tar.gz", repos = NULL, type = "source")

内容的提问来源于stack exchange,提问作者Dan Hicks

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 22:13:14