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:
- 下载源码包:
wget https://cran.r-project.org/src/contrib/Archive/MASS/MASS_7.3-54.tar.gz - 解压:
tar -xzf MASS_7.3-54.tar.gz - 进入目录,将
MASS.c中所有Sint替换为int - 重新打包:
tar -czf MASS_7.3-54_modified.tar.gz MASS - 安装修改后的包:
install.packages("MASS_7.3-54_modified.tar.gz", repos = NULL, type = "source")
内容的提问来源于stack exchange,提问作者Dan Hicks
相关产品推荐
相关产品推荐

