0%

日常解惑-记录一次macOS版本升级的perl坑

前情

在更新了macOS Big Sur 11.2.1之后,我用LaTeX写的论文,然后在格式化的时候突然报错:Can't locate File/HomeDir.pm in @INC

简单看了下,应该是perl少了某个模块,因为格式化程序是用到perl写的,那就用perl自己的包管理程序cpan进行安装下载呗。

但是下载的时候出现了一个问题:fatal error: 'EXTERN.h' file not found,一个头文件给丢失了。

解决

那既然这个头文件perl找不到,那我就试着找一下:sudo find /Library -type f -name EXTERN.h

1
2
3
4
5
/Library/Developer/CommandLineTools/SDKs/MacOSX11.1.sdk/System/Library/Perl/5.30/darwin-thread-multi-2level/CORE/EXTERN.h
/Library/Developer/CommandLineTools/SDKs/MacOSX11.1.sdk/System/Library/Perl/5.28/darwin-thread-multi-2level/CORE/EXTERN.h
/Library/Developer/CommandLineTools/SDKs/MacOSX11.1.sdk/System/Library/Perl/5.18/darwin-thread-multi-2level/CORE/EXTERN.h
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Perl/5.28/darwin-thread-multi-2level/CORE/EXTERN.h
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Perl/5.18/darwin-thread-multi-2level/CORE/EXTERN.h

emmm 明明是有的,而且不同的macOS版本还有不同的perl,而不同的perl都有自己的文件,那它怎么会说找不到呢?

再来仔细看看报错内容:

1
Couldn't execute cc  -g -pipe -fno-strict-aliasing -fstack-protector-strong -DPERL_USE_SAFE_PUTENV -Os "-I/System/Library/Perl/5.28/darwin-thread-multi-2level/CORE"   -c HASCOMPILERJcdN/TESTRD3V.c -o HASCOMPILERJcdN/TESTRD3V.o: Inappropriate ioctl for device at Makefile.PL line 14.

猜测头文件应该是在/System/Library/Perl/5.28/darwin-thread-multi-2level/CORE这个目录中的,但是我到对应目录下去找了下,里面只有一个文件,确实有点问题,正常的perl的CORE目录下面应该有非常多的头文件(当然EXTERN.h)也包含在其中。

上网搜索了一下,发现GitHub上面有人有相同的问题,而且也是更新了Big Sur之后的问题。

之后在Stack Overflow上面找到了两类解决问题的办法:

  1. 继续使用macOS自带的perl版本,通过设置CPATH这个环境变量来告诉编译器头文件的位置,然后安装一个Mac的module解决,详情见这里。但是我按照它说的方法设置好了环境变量,仍然无效,还是找不到头文件。我还尝试使用软连接把所有的头文件给添加上去,但是就算我使用sudo命令,仍然是没有权限。
  2. [推荐]使用brew安装一个新版的perl,并且使用brew link perl来使用brew安装的perl,并且使用这版的perl对应的cpan来安装对应的模块,解决。

扩展

为什么我之前设置了CPATH是无效的,为什么别人是有效的呢?

因为环境变量是针对用户而言的,我用我自己的用户身份设置了CPATH这个环境变量,但是运行的时候用的是sudo cpan install <module>,用到了sudo这个命令,而这个命令是让另外一个用户执行这个命令,默认情况就是root用户。所以此时当然是无法生效的啦。