執行 `arch -x86_64 zsh`報`arch: posix_spawnp: zsh: Bad CPU type in executable` 原因: 未安裝rosetta 執行`softwareupdate --install-rosetta`安裝rosetta報 ``` Package... ...
問題&解決方法
先說解決方法, 感興趣的可以瞭解事情的經過, 也許我描述的問題不專業, 但確實解決了當下的問題, 歡迎留言討論
這裡主要是兩個問題, 一個是啟用rosetta
模式失敗, 一個是架構混合導致項目跑不起來
啟用rosetta
模式失敗
執行 arch -x86_64 zsh
報arch: posix_spawnp: zsh: Bad CPU type in executable
原因: 未安裝rosetta
執行softwareupdate --install-rosetta
安裝rosetta報
Package reference com.apple.pkg.RosettaUpdateAuto is missing installKBytes attribute
原因: 系統版本低無法安裝, 更新系統
架構混合導致項目跑不起來
在arm64
架構下安裝了brew, 執行arch -x86_64 zsh
後, 導致brew安裝了x86
架構的命令工具, 通過rvm
安裝ruby
時又因為brew的架構只能安裝arm64
的, 運行項目時報
LoadError - dlopen(/Users/q/.rvm/gems/ruby-2.7.2/gems/nkf-0.2.0/lib/nkf.bundle, 0x0009): tried: '/Users/q/.rvm/gems/ruby-2.7.2/gems/nkf-0.2.0/lib/nkf.bundle' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e' or 'arm64')), '/System/Volumes/Preboot/Cryptexes/OS/Users/q/.rvm/gems/ruby-2.7.2/gems/nkf-0.2.0/lib/nkf.bundle' (no such file), '/Users/q/.rvm/gems/ruby-2.7.2/gems/nkf-0.2.0/lib/nkf.bundle' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e' or 'arm64')) - /Users/q/.rvm/gems/ruby-2.7.2/gems/nkf-0.2.0/lib/nkf.bundle
原因: brew安裝了不同架構的命令工具
解決方法: 統一架構, 先卸載brew, 統一安裝x86架構的工具
在你執行了arch -x86_64 zsh
, 且安裝了brew
的情況下
不妨檢查一下安裝的brew的架構
which brew
# 這是x86模式下安裝的brew
/usr/local/bin/brew
# 這是arm模式下安裝的brew
/opt/homebrew
背景
公司配了一臺M3的MacBook Pro, 配置確實高, 速度也很快
作為一個前端開發, nodejs必不可少, 公司項目需要用到低版本的nodejs(<=14), 這裡我們一般會用到nvm管理nodejs版本
所以, 第一步, 安裝nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
對了, 一般咱們還會使用iterm2替代mac的終端, 並使用zsh作為shell解釋器, 是的, 再安裝一個oh-my-zsh
這個時候你應該能執行nvm
命令了
# 列出所有可以安裝的 Node.js 版本
nvm ls-remote
# 安裝最新的穩定版
nvm install latest
安裝14以後的版本(>=15)是沒問題的, 安裝12會有一大堆編譯信息, 等待十多分鐘會發現報錯, 無法使用
解決辦法
使用rosetta
模式
在 Apple Silicon Macs 上,你可以使用
Rosetta 2
來運行x86_64
架構的應用程式,包括終端shell
。使用arch -x86_64 zsh
命令可以啟動一個通過Rosetta 2
運行的zsh shell
,這樣你就可以在x86_64
環境中運行命令和安裝軟體。
arch -x86_64 zsh
正常情況下, 咱執行會提示安裝 Rosetta 2
, 如果已經安裝則沒有反饋, 然後就可以執行 nvm install 12
安裝nodejs了
天有不測風雲, 我居然報錯了
arch: posix_spawnp: zsh: Bad CPU type in executable
這就讓我覺得莫名其妙了
通過搜索, 我明白我需要先安裝Rosetta 2
, 可以通過執行
softwareupdate --install-rosetta
正常情況下, 也是等待安裝即可
而我, 又掉坑裡了
Package reference com.apple.pkg.RosettaUpdateAuto is missing installKBytes attribute
我開始懷疑人生了, 好在我發現可能和系統版本有關, 於是我果斷升級系統
確實好了, nodejs環境確實沒問題了
新問題
現在需要運行ios項目, 統一使用2.7.2
的ruby
, 電腦自帶的是2.6, 沒辦法, 最好用一個ruby的版本管理工具 -- rvm
安裝rvm需要有brew, 聰明的我在執行 arch -x86_64 zsh
之前就已經安裝好了, 我真是個小機靈鬼
很快, 我就為自己的行為付出了代價
原因
由於我在執行arch -x86_64 zsh
之前安裝的brew, 所以brew安裝的工具都是arm64
架構的, 這個時候我安裝 gnupg
提示我
Error: Cannot install under Rosetta 2 in ARM default prefix (/opt/homebrew)!
To rerun under ARM use:
arch -arm64 brew install ...
To install under x86_64, install Homebrew into /usr/local.
這個時候我就執行arch -arm64 brew install gnupg
安裝了arm64
架構的gnupg(我也不知道幹嘛的), 這個時候工具的依賴也安裝的arm64
架構的
在我安裝其他依賴的時候, 也開始提醒我使用arm架構的方式安裝
真正的坑
沒錯, 後來我安裝了rvm
, 在x86模式下, 使用arm64
架構的brew
安裝的rvm
, 你猜它是什麼架構 -- 還是arm64架構
我終於可以執行 rvm install 2.7.2
安裝指定版本的ruby了, 我發現安裝不上, 聰明的我果然通過 arch -arm64 rvm install 2.7.2
的方式安裝上了arm64
架構的ruby
於是我滿心歡喜的去安裝項目依賴了, 噩夢開始了
類似ges: autoconf, automake, libtool, pkg-config, coreutils, libyaml, libksba, readline, zlib, [email protected] 這些依賴, 我安裝的應該是x86
架構的, 這裡項目用到了bundler
, 是啥不重要, 就是一個工具, 跟著敲命令就完了
執行 bundler install
安裝項目依賴, 然後又執行 bundle exec pod install
, 這個時候問題出現了
LoadError - dlopen(/Users/q/.rvm/gems/ruby-2.7.2/gems/nkf-0.2.0/lib/nkf.bundle, 0x0009): tried: '/Users/q/.rvm/gems/ruby-2.7.2/gems/nkf-0.2.0/lib/nkf.bundle' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e' or 'arm64')), '/System/Volumes/Preboot/Cryptexes/OS/Users/q/.rvm/gems/ruby-2.7.2/gems/nkf-0.2.0/lib/nkf.bundle' (no such file), '/Users/q/.rvm/gems/ruby-2.7.2/gems/nkf-0.2.0/lib/nkf.bundle' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e' or 'arm64')) - /Users/q/.rvm/gems/ruby-2.7.2/gems/nkf-0.2.0/lib/nkf.bundle
我看到了have 'x86_64', need 'arm64e' or 'arm64'
, 我就知道事情不對了, 我又把這些工具庫換成arm64
架構的, 還是跑不起來, 開始懷疑人生了, 於是和同事對了一下工具的版本號
我意識到ruby是arm64
架構的, 導致x86
的工具不能使用, 但是我又裝不上x86的ruby, 一想到ruby, 我想著不用rvm管理版本, 直接下載一個, 確實也奏效了, 我逐漸意識到了問題的所在
查看ruby的架構
ruby -v
# ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-darwin24]
這裡我已經換上了x86的ruby
查看brew的架構
錯誤的方式
在網上搜到了這個代碼
brew config
HOMEBREW_VERSION: 4.3.24
ORIGIN: https://github.com/Homebrew/brew
HEAD: 916044581862c32fc2365e8e9ff0b1507a98925e
Last commit: 2 days ago
Core tap JSON: 24 Sep 09:41 UTC
Core cask tap JSON: 24 Sep 09:41 UTC
HOMEBREW_PREFIX: /usr/local
HOMEBREW_CASK_OPTS: []
HOMEBREW_MAKE_JOBS: 12
Homebrew Ruby: 3.3.4 => /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/3.3.4_1/bin/ruby
CPU: dodeca-core 64-bit westmere
Clang: 16.0.0 build 1600
Git: 2.39.5 => /Applications/Xcode.app/Contents/Developer/usr/bin/git
Curl: 8.7.1 => /usr/bin/curl
macOS: 15.0-x86_64
CLT: 16.0.0.0.1.1724870825
Xcode: 16.0
Rosetta 2: true
乍一看確實是-x86_64
, 本著懷疑態度, 我執行了 arch -arm64 brew config
HOMEBREW_VERSION: 4.3.24
ORIGIN: https://github.com/Homebrew/brew
HEAD: 916044581862c32fc2365e8e9ff0b1507a98925e
Last commit: 2 days ago
Core tap JSON: 24 Sep 09:41 UTC
Core cask tap JSON: 24 Sep 09:41 UTC
HOMEBREW_PREFIX: /usr/local
HOMEBREW_CASK_OPTS: []
HOMEBREW_MAKE_JOBS: 12
Homebrew Ruby: 3.3.4 => /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/3.3.4_1/bin/ruby
CPU: dodeca-core 64-bit westmere
Clang: 16.0.0 build 1600
Git: 2.39.5 => /Applications/Xcode.app/Contents/Developer/usr/bin/git
Curl: 8.7.1 => /usr/bin/curl
macOS: 15.0-arm64
CLT: 16.0.0.0.1.1724870825
Xcode: 16.0
Rosetta 2: false
因為我是在arm64的架構下安裝的brew, 然後執行的
arch -x86_64 zsh
修改終端的架構為x86
正確的方式
其實很簡單, 看brew的執行路徑
which brew
# 這是x86模式下安裝的brew
/usr/local/bin/brew
# 這是arm模式下安裝的brew
/opt/homebrew
總結
配置環境的時候, 統一版本很重要, 有時候一個小版本都會導致項目運行差異, 真可謂是 差之毫釐謬以千里
咱們遇到的這些問題, 都是處理器架構導致的, 我們要儘可能統一開發環境
這次踩坑的原因有兩個
- 自作聰明
- 系統版本
正常情況下, 拿著 M晶元
的mac, 一定要註意架構差異