如何在M1芯片Mac上使用依赖C库的Perl模块?
M1芯片Mac Perl XS模块架构不匹配问题解决方案
报错核心原因为架构不兼容:在Rosetta(x86_64模拟环境)终端下编译安装的Perl XS模块为x86_64架构,无法被原生M1环境下运行的arm64架构Perl加载。可根据使用场景选择以下任一方案解决:
方案1:固定使用Rosetta环境运行(快速生效,无需重新安装模块)
保持终端「使用Rosetta打开」的勾选状态,所有Perl相关的安装、脚本运行操作都在该Rosetta终端内执行即可,无需修改现有已安装的模块。
方案2:原生arm64环境适配(推荐,可发挥M1芯片性能)
- 第一步:卸载之前在Rosetta环境下安装的所有报错XS模块,执行命令:
cpanm --uninstall Text::CSV Text::CSV_XS XML::LibXML MARC::Record MARC::File::XML
其他出现同类架构报错的模块也可同步加入卸载列表 - 第二步:右键点击终端应用,取消「使用Rosetta打开」的勾选,重启终端后执行
arch命令,确认返回结果为arm64,验证当前为原生架构环境 - 第三步:安装arm64版本的编译依赖工具链,执行
xcode-select --install安装Xcode命令行工具,已安装可跳过。如果使用Homebrew包管理器,需确认使用的是/opt/homebrew路径下的arm64原生版本,避免调用x86_64版本的依赖库 - 第四步:重新安装对应Perl模块,执行命令:
cpanm Text::CSV XML::LibXML MARC::Record MARC::File::XML
此时编译生成的XS模块二进制文件会自动适配arm64架构,可正常加载运行
方案3:多架构兼容配置(适用于需要同时在两种架构下运行Perl脚本的场景)
在shell配置文件(/.zshrc或/.bashrc)中添加以下配置,为不同架构的Perl模块设置独立的存储路径,避免冲突:
if [ "$(arch)" = "arm64" ]; then export PERL5LIB="$HOME/perl5/arm64/lib/perl5" export PATH="$HOME/perl5/arm64/bin:$PATH" else export PERL5LIB="$HOME/perl5/x86_64/lib/perl5" export PATH="$HOME/perl5/x86_64/bin:$PATH" fi
配置生效后,在不同架构的终端下安装的模块会分别存储到对应路径,不会出现交叉加载的架构不匹配问题。
内容的提问来源于stack exchange,提问作者anaximander
相关产品推荐
相关产品推荐

