如何编写shell.nix配置x86_64-darwin到mips-linux-gnu交叉编译环境?
解决M1 Mac(Rosetta2 x86_64-darwin)下Nix交叉编译sm64的环境配置问题
核心问题分析
你遇到的问题本质是Nix交叉编译的平台三元组配置错误:你需要的是运行在x86_64-darwin(构建/主机平台)、针对mips-linux-gnu(目标平台)的交叉工具链,但之前的配置误将主机平台设为了mips-linux-gnu,导致拉取的binutils等工具是MIPS架构,无法在x86_64的Rosetta环境执行。
正确的shell.nix配置方案
直接使用Nix的pkgsCross.mips-linux-gnu来获取针对目标平台的交叉工具链,同时确保工具链本身编译为x86_64-darwin可执行格式:
{ pkgs ? import <nixpkgs> {} }: pkgs.mkShell { # 引入x86_64-darwin构建的、针对mips-linux-gnu的交叉工具链 buildInputs = with pkgsCross.mips-linux-gnu; [ binutils gcc # 构建辅助工具直接从主pkgs拉取(x86_64-darwin架构,可直接执行) pkgs.make pkgs.python3 ]; # 配置环境变量,让sm64构建脚本识别交叉工具链 shellHook = '' export CROSS_COMPILE=mips-linux-gnu- export PATH=$PATH:${pkgsCross.mips-linux-gnu.binutils}/bin:${pkgsCross.mips-linux-gnu.gcc}/bin ''; }
关键配置说明
pkgsCross.mips-linux-gnu是Nixpkgs预定义的交叉编译工具链集合,会自动生成能在当前x86_64-darwin平台运行、输出mips-linux-gnu目标代码的binutils、gcc等工具。- 主pkgs下的
make、python3属于构建辅助工具,本身是x86_64-darwin架构,直接加入buildInputs即可正常执行,无需放入交叉工具链集合。 CROSS_COMPILE环境变量是sm64构建脚本的必填项,用于指定交叉工具的前缀,确保脚本调用mips-linux-gnu-gcc而非系统默认gcc。
验证方法
进入nix-shell后,执行以下命令确认工具链正确性:
# 查看gcc的目标架构,输出应包含mips-linux-gnu mips-linux-gnu-gcc -v # 检查工具本身的运行架构,输出应为x86_64 file $(which mips-linux-gnu-gcc)
内容的提问来源于stack exchange,提问作者CrepeGoat
相关产品推荐
相关产品推荐

