在 Apple Silicon (M1) 上运行 CocoaPods

Jac*_*nig 143 macos ios cocoapods flutter apple-silicon

我有一个 Flutter 项目,我试图在 iOS 上运行。它在我的基于 Intel 的 Mac 上正常运行,但在我新的基于 Apple Silicon 的 M1 Mac 上它无法安装 pod。

LoadError - dlsym(0x7f8926035eb0, Init_ffi_c): symbol not found - /Library/Ruby/Gems/2.6.0/gems/ffi-1.13.1/lib/ffi_c.bundle
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
/Library/Ruby/Gems/2.6.0/gems/ffi-1.13.1/lib/ffi.rb:6:in `rescue in <top (required)>'
/Library/Ruby/Gems/2.6.0/gems/ffi-1.13.1/lib/ffi.rb:3:in `<top (required)>'
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
/Library/Ruby/Gems/2.6.0/gems/ethon-0.12.0/lib/ethon.rb:2:in `<top (required)>'
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
/Library/Ruby/Gems/2.6.0/gems/typhoeus-1.4.0/lib/typhoeus.rb:2:in `<top (required)>'
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/sources_manager.rb:74:in `cdn_url?'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/sources_manager.rb:36:in `create_source_with_url'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/sources_manager.rb:21:in `find_or_create_source_with_url'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/installer/analyzer.rb:178:in `block in sources'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/installer/analyzer.rb:177:in `map'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/installer/analyzer.rb:177:in `sources'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/installer/analyzer.rb:1073:in `block in resolve_dependencies'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/user_interface.rb:64:in `section'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/installer/analyzer.rb:1072:in `resolve_dependencies'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/installer/analyzer.rb:124:in `analyze'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/installer.rb:414:in `analyze'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/installer.rb:239:in `block in resolve_dependencies'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/user_interface.rb:64:in `section'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/installer.rb:238:in `resolve_dependencies'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/installer.rb:160:in `install!'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/command/install.rb:52:in `run'
/Library/Ruby/Gems/2.6.0/gems/claide-1.0.3/lib/claide/command.rb:334:in `run'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/lib/cocoapods/command.rb:52:in `run'
/Library/Ruby/Gems/2.6.0/gems/cocoapods-1.10.0/bin/pod:55:in `<top (required)>'
/usr/local/bin/pod:23:in `load'
/usr/local/bin/pod:23:in `<main>'
Run Code Online (Sandbox Code Playgroud)

基于 Github 解决方法,我尝试使用 rosetta 运行终端,但问题仍然存在:https : //github.com/CocoaPods/CocoaPods/issues/9907#issuecomment-655870749

意识到采用 Apple Silicon 的 Mac 还为时尚早。有没有办法暂时使这项工作?

Lor*_*lor 227

2021 年 9 月仍在工作

#1 安装 ffi

sudo arch -x86_64 gem install ffi
Run Code Online (Sandbox Code Playgroud)

#2 重新安装依赖

arch -x86_64 pod install
Run Code Online (Sandbox Code Playgroud)

  • 这些命令可以正常工作,但您**必须使用系统版本的 Ruby**。当我通过 rbenv 使用 Ruby 2.7 时,这不起作用 (6认同)
  • arch: posix_spawnp: gem: 可执行文件中的 CPU 类型错误 (5认同)
  • 在 MacMini M1 中为我工作 (4认同)
  • “2022更新”适用于M1! (3认同)
  • 更新到 xcode 14 后,自制的 cocoapods 版本失败并出现错误 (3认同)
  • 我也遇到了同样的错误,按照上面的方法,pod就安装好了。我使用的是 MacBook M1 (2认同)
  • @Metropolis,这是否意味着每次我要安装新的 Pod 时,我都会使用这个命令“arch -x86_64 pod install”? (2认同)
  • 这些命令对我有用,而原始答案却没有。谢谢! (2认同)
  • 这个答案应该被标记为 2021 年的正确答案。 (2认同)
  • 在 MacBook Air 上运行良好。谢谢 (2认同)
  • 2022 年 2 月 - 这有效。这里有很多过时的答案,因为原生 Apple Silicon 最近才开始与 CocoaPod 配合使用。感谢您更新此答案! (2认同)

Jac*_*nig 177

编辑:我最近禁用了 Rosetta,并且添加了 ffi gem 后 Cocoapods 运行得很好。

对于其他在这个问题上苦苦挣扎的人,我刚刚找到了解决它的方法。除了在 Rosetta 中运行终端:

  1. 在 Finder 中右键单击终端
  2. 获取信息
  3. 与罗塞塔一起打开

我安装了一个 gem,它似乎与错误中找不到的符号有关:

sudo gem install ffi
Run Code Online (Sandbox Code Playgroud)

执行此操作后,cocoapods 按预期运行。

  • 这似乎也对我有用。首先,在终端上启用 Rosetta,按照上面的说明安装 ffi gem,然后就可以禁用 Rosetta。 (3认同)
  • 工作正常。在调用“pod install”之前,我需要保持终端的“open with Rosetta”(如果没有,则会失败)下一个解决方案(使用“-x86_64”选项)似乎也不错,我会尝试一下。 (2认同)

Val*_*and 55

特尔;博士:

  • 使用 Homebrew / rbenv / RVM 安装您自己的 Ruby 版本(例如brew install ruby
  • 将它和 gems 二进制文件添加到您的PATH并确保使用新版本which ruby(如果与 Homebrew 一起安装/opt/homebrew/opt/ruby/bin/ruby/usr/bin/ruby则应该是而不是)
  • 安装 CocoaPods sudo gem install cocoapods(确保ethon版本至少为 0.13.0)
  • pod install

详细解答:

所有建议使用 Rosetta / 的答案arch -x86_64都是解决方法,并没有完全解决 RbConfig 和通用二进制文件工作方式带来的真正问题。

require 'rbconfig'

OSVERSION = RbConfig::CONFIG['host_os']
ARCH = RbConfig::CONFIG['arch']
HOSTCPU = RbConfig::CONFIG['host_cpu']
BUILDCPU = RbConfig::CONFIG['build_cpu']
TARGETCPU = RbConfig::CONFIG['target_cpu']

puts "OS: #{OSVERSION}"
puts "Arch: #{ARCH}"
puts "Host CPU: #{HOSTCPU}"
puts "Build CPU: #{BUILDCPU}"
puts "Target CPU: #{TARGETCPU}"
Run Code Online (Sandbox Code Playgroud)

如果您ruby使用 macOS 附带的通用二进制文件调用包含此代码的文件,您将在 M1 Mac 上获得以下结果:

OS: darwin20
Arch: universal-darwin20
Host CPU: x86_64
Build CPU: x86_64
Target CPU: universal
Run Code Online (Sandbox Code Playgroud)

如您所见,RbConfig 是为“通用”CPU 编译的,但使用 x86 CPU 构建rbconfig.rb,因此生成的文件(请参阅 参考资料/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/universal-darwin20/rbconfig.rb)使用主机 CPU 的无效信息。

Asffi使用来自 RbConfig 的信息(参见https://github.com/ffi/ffi/blob/dfae59e293974efaa7b4d414e5116d7a2187a06e/lib/ffi/platform.rb#L61https://github.com/ffi/ffi/blob/e37f2cf57b4d414e5116d7a2187a06e / /ffi/fixtures/compile.rb#L11),我们最终得到了 OP 的错误消息。

因此,解决方案是使用 Homebrew、rbenv 或 RVM 获得专为 arm64 构建的 Ruby 版本。

对于自制:

  • 执行 brew install ruby
  • 添加export PATH=/opt/homebrew/opt/ruby/bin:/opt/homebrew/lib/ruby/gems/3.0.0/bin:$PATH到你的.zshrc$(brew --prefix)如果需要,你可以找到你的 Homebrew 安装目录)
  • 执行source ~/.zshrc或重启你的 shell
  • ruby通过执行which ruby(应该是$(brew --prefix)/opt/ruby/bin/ruby)确保您使用的是正确的二进制文件
  • 安装 CocoaPods sudo gem install cocoapods
  • pod通过执行which pod(应该是$(brew --prefix)/lib/ruby/gems/3.0.0/bin/pod)确保您使用的是正确的二进制文件
  • 确保ethon版本为 0.13.0 或更高版本gem info ethon,否则运行sudo gem install ethon
  • pod install

默认情况下,未来的 macOS 版本不会附带 Ruby

此外,应该注意的ruby是,macOS 中仍然仅包含“为了与旧软件兼容”,如运行所证明的那样irb -v,因此无论如何这可能是安装您自己的版本的好机会:

警告:此版本的 ruby​​ 包含在 macOS 中,以便与旧版软件兼容。在 macOS 的未来版本中,默认情况下 ruby​​ 运行时将不可用,并且可能需要您安装额外的软件包。

irb 1.0.0 (2018-12-18)

资料来源:

  • 是的,“which ruby​​”和“which gem”显示了正确的目录。我卸载了 cocapods 并重新安装,但没有用。如果我输入 `$(brew --prefix)/lib/ruby/gems/3.0.0/bin/pod) install` 而不是 `pod install` 它就可以工作。不知何故,cocapod 看起来像是 `usr/bin` 而不是 ruby​​ 路径 (8认同)
  • 我完成了这些步骤,但哪个 pod 仍然给我 `/usr/local/bin/pod` 路径。其他步骤都是正确的。如何将 pod 位置更改为 ruby​​ 1? (5认同)
  • @EmreÖnder 你解决过这个问题吗?我的 M1 计算机今天到达,但无法让 pod 指向正确的 ruby​​。 (4认同)
  • “arch -x86_64”是一个让事情正常工作的黑客,所以这应该是公认的答案。工作完美。 (3认同)
  • 这有效。忘记其他答案中的“arch -x86_64”规避。 (2认同)
  • @MikePortanova 我可以帮助你。这在我的新 iMac 上就像一个魅力。首先,运行“brew --prefix”。假设结果是“mikes/path”。那么你的更改将是“export PATH=mikes/path/opt/ruby/bin:mikes/path/lib/ruby/gems/3.0.0/bin:$PATH”。现在,在安装 ruby​​ 和 cocoa 后,“which ruby​​”和“which pod”应该分别返回“mikes/path/opt/ruby/bin/ruby”和“mikes/path/lib/ruby/gems/3.0.0/bin/pod”答案中提到的豆荚。 (2认同)

Med*_*dhi 46

要在带有 M1 芯片(Apple Silicon)的 Mac 上完全安装 cocoapods,请按照以下步骤操作:

  1. 复制 Utilities 文件夹中的终端应用程序。
  2. 右键单击该应用程序并选择获取信息。
  3. 根据需要重命名其他版本的应用程序。
  4. 选中“使用 Rosetta 打开”选项。
  5. 使用命令“sudo gem install cocoapods”安装 Cocoapods
  6. 输入命令行“gem install ffi”来修复ffi包问题。现在您可以毫无问题地进行“pod install”。

来源:iPhoneSoft


pra*_*huk 39

我发现的最简单的方法:

sudo gem uninstall cocoapods

brew install cocoapods


pfu*_*her 14

在 Rosetta 2 中运行终端的另一种方法是使用 设置架构arch -x86_64,如下所示:

arch -x86_64 sudo gem install cocoapods -n /usr/local/bin
Run Code Online (Sandbox Code Playgroud)

为了给予应有的信任,我在这里找到了这个解决方案

MacPorts 错误跟踪器,问题 #61545,评论 7


sam*_*miq 12

有一个“更好/更容易?” 现在水已经稳定,通过使用自制程序的方式,如果您安装了自制程序,只需运行

brew install cocoapods
Run Code Online (Sandbox Code Playgroud)

这将安装 ruby​​ 和 libyaml 作为先决条件,到目前为止,这是最直接的方法(也是最有可能推荐的方法)。


Mat*_*teo 11

基本上尝试了这里列出的所有解决方案。

$ arch -arm64 brew install cocoapods
Run Code Online (Sandbox Code Playgroud)

终于为我做到了。

在此之前,请确保已正确安装自制程序并/opt/homebrew使用前缀。本文对此提供了很好的说明。

编辑:另一种选择是删除所有 flutter 和 dart 文件,然后仅使用 homebrew 来完成完整的安装过程,如下所示。这对我在 M1 Pro 上也有效。


小智 10

Kotlin 多平台移动开发

如果您在这里是因为运行时遇到此错误kdoctor

ruby@2.7 为我工作,所以:

brew install ruby@2.7
Run Code Online (Sandbox Code Playgroud)

切换到新安装的Ruby版本:

brew link --overwrite ruby@2.7
Run Code Online (Sandbox Code Playgroud)

然后安装CocoaPods:

brew install cocoapods
Run Code Online (Sandbox Code Playgroud)


小智 9

请使用下面的代码:-

arch -x86_64 pod install

在任何情况下,这肯定会起作用。


小智 8

2021 年 9 月工作,Mac M1

我只想添加Medhi 的答案,在 iOS 文件夹内的同一终端内执行“pod repo update”,因为这对我来说至关重要地修复了错误。

这是完整的待办事项列表:

  1. 在实用程序文件夹中复制终端应用程序。

  2. 右键单击该应用程序并选择“获取信息”。

  3. 根据需要重命名该应用程序的其他版本。

  4. 选中“用 Rosetta 打开”选项。

  5. 使用命令安装 Cocoapodssudo gem install cocoapods

  6. 键入命令行sudo gem install ffi来修复 ffi 捆绑问题。

  7. 转到同一终端中应用程序的 iOS 文件夹

  8. pod repo update

  9. 现在你可以pod install毫无问题地进行了。


Ka *_*Tkw 7

\xe2\x9c\x85 以下解决方案适用于我的 Apple M1 机器。

\n

我花了一个多星期的时间寻找在 M1 机器上成功安装 CocoaPods 的解决方案。你可以看看我的方法是否适合你。

\n

该解决方案要求 Terminal.app 在“ Rosetta ”模式下运行。

\n

但它不要求终端在 x86 中运行。

\n

[环境]

\n

Mac mini(M1,2020)/macOS Big Sur(版本 11.5.2)/Xcode 版本 13.0 (13A233)

\n
\n

终端+罗塞塔

\n

(CocoaPods 安装需要 Rosetta)

\n

要在“ Rosetta ”模式下运行terminal.app ,

\n

右键单击 Terminal.app > 选择“获取信息”> 确保选中“使用 Rosetta 打开”。

\n

显示选中“使用 Rosetta 打开”项目的复选框的图像。

\n
\n

脚步

\n

(1) 运行以下行来更新 gem。

\n

在执行以下任何命令之前,请确保您的 gem 版本是最新的。Medium 上的这篇文章介绍了此更新。

\n
sudo gem update -n /usr/local/bin --system\n\nsudo gem install  -n /usr/local/bin cocoapods --pre\n
Run Code Online (Sandbox Code Playgroud)\n

(2) 使用“sudo”命令执行命令。

\n
sudo gem install\n
Run Code Online (Sandbox Code Playgroud)\n

(3)安装旧版本的CocoaPods

\n

由于我的情况无法安装最新版本(1.10.0)。我尝试过安装旧版本。该行成功执行,没有任何错误消息。

\n

您可以查看Apple 论坛上的帖子。

\n
sudo gem install -n /usr/local/bin cocoapods -v 1.8.4\n
Run Code Online (Sandbox Code Playgroud)\n
\n

错误解决方案

\n

然后,编译器可能会给您带来一些错误,例如“活动开发人员路径不存在”。如果您在计算机上安装了 Xcode 的测试版,则会显示此错误。

\n

您需要运行以下几行,编译器才能切换到新的活动路径,指向新的 Xcode 应用程序。

\n
sudo xcode-select --switch \xef\xbc\x8fApplications/Xcode.app/Contents/Developer\n
Run Code Online (Sandbox Code Playgroud)\n

如果你的 Xcode拒绝切换,你可以查看Apple 论坛上的这个帖子,看看是否有帮助。

\n
\n

最后一步 \xe2\xac\x87\xef\xb8\x8f

\n

(1)取消选中“使用Rosetta打开

\n

然后,可以返回“信息”面板并取消选中“使用 Rosetta 打开”,但取消选中 Rosetta 是可选的。如果需要,您可以选中该框。

\n

(2)照常运行CocoaPods命令

\n

之后,您可以返回项目目录并运行命令pod init来像往常一样为您的项目启动 CocoaPods

\n

正常 CocoaPods 构建的步骤:

\n
    \n
  1. pod init
  2. \n
  3. open Podfile
  4. \n
  5. edit Podfile(用于指定 pod)
  6. \n
  7. pod install
  8. \n
  9. .xcworkspace已准备好在 Xcode 中打开
  10. \n
\n

sudo xcodebuild -license如果您遇到错误(关于 Xcode 注册),请使用。

\n


Jad*_*Jad 6

3 月 28 日更新

1- arch -x86_64 sudo gem install cocoapods -n /usr/local/bin

2- arch -x86_64 sudo gem install ffi

3- pod install

无需复制或使用 Rosetta 打开


Sur*_*han 6

安装cocoapods

sudo arch -x86_64 gem install ffi
Run Code Online (Sandbox Code Playgroud)

安装 Pod 文件

arch -x86_64 pod install
Run Code Online (Sandbox Code Playgroud)

更新 Pod

arch -x86_64 pod update
Run Code Online (Sandbox Code Playgroud)


Gov*_*hwa 6

Pod 未安装在M1 芯片 MAC上???不用担心

运行以下三个命令:-

pod deintegrate

sudo arch -x86_64 gem install ffi

arch -x86_64 pod install
Run Code Online (Sandbox Code Playgroud)

有用 !!


Mic*_*ski 6

Mac M1 MacOS BigSur解决方案:

brew cleanup -d -v    
brew install cocoapods
brew link --overwrite cocoapods
Run Code Online (Sandbox Code Playgroud)


Har*_*ain 5

  1. 执行以下操作以安装所需的ffi

    sudo arch -x86_64 gem install ffi

  2. 而不是pod install使用:

    arch -x86_64 pod install


小智 5

如果您已经更新了项目并且已经安装了 ffi,则需要运行以下命令:

arch -x86_64 pod install --repo-update
Run Code Online (Sandbox Code Playgroud)