'How to run CocoaPods on Apple Silicon (M1)
I have a Flutter project that I'm trying to run on iOS. It runs normally on my Intel-based Mac, but on my new Apple Silicon-based M1 Mac it fails to install pods.
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>'
Based on a Github workaround, I tried to run Terminal using rosetta, but the issue remains the same: https://github.com/CocoaPods/CocoaPods/issues/9907#issuecomment-655870749
Realising it's still early for Macs with Apple Silicon. Is there a way to make this work for the time being?
Solution 1:[1]
EDIT: I recently disabled Rosetta, and Cocoapods runs just fine with the addition of the ffi gem.
For anyone else struggling with this issue, I just found a way to solve it. In addition to running terminal in Rosetta:
- Right-click on Terminal in Finder
- Get Info
- Open with Rosetta
I installed a gem that seems to be related to the symbol not found in the error:
sudo gem install ffi
After doing this, cocoapods runs as expected.
Solution 2:[2]
2022 May Update
If you can use Homebrew to manage cocoapods.
# Uninstall the local cocoapods gem
sudo gem uninstall cocoapods
# Reinstall cocoapods via Homebrew
brew install cocoapods
2021 Solution
# STEP 1: Install ffi
sudo arch -x86_64 gem install ffi
# STEP 2: Re-install dependencies
arch -x86_64 pod install
Additional Information
#1 For anyone seeing the arch: posix_spawnp: gem: Bad CPU type in executable
error, you must first install Rosetta. Thanks, @Jack Dewhurst
#2 If you run pod
commands pretty often, setting up an alias in .zshrc
or .bash_profile
might be handy. Thanks, @theMoonlitKnight for the suggestion.
alias pod='arch -x86_64 pod'
Solution 3:[3]
TL;DR:
- Install your own version of Ruby with Homebrew / rbenv / RVM (e.g.
brew install ruby
) - Add it and the gems binaries to your
PATH
and make sure the new version is used withwhich ruby
(should be/opt/homebrew/opt/ruby/bin/ruby
instead of/usr/bin/ruby
if installed with Homebrew) - Install CocoaPods with
sudo gem install cocoapods
(make sureethon
is at least version 0.13.0) - Run
pod install
Detailed answer:
All answers suggesting using Rosetta / arch -x86_64
are workarounds and not quite solving the real issue that comes from the way RbConfig and the universal binaries work.
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}"
If you call ruby
on a file containing this code with the universal binary shipped with macOS, you will get the following result on an M1 Mac:
OS: darwin20
Arch: universal-darwin20
Host CPU: x86_64
Build CPU: x86_64
Target CPU: universal
As you can see, RbConfig was compiled for a « universal » CPU but built with an x86 CPU, and the rbconfig.rb
file that was generated (see /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/universal-darwin20/rbconfig.rb
) consequently uses invalid information for the host CPU.
As ffi
uses information from RbConfig (see https://github.com/ffi/ffi/blob/dfae59e293974efaa7b4d414e5116d7a2187a06e/lib/ffi/platform.rb#L61 and https://github.com/ffi/ffi/blob/e3f2cf9b82055709ddbeecbf77810f43438c4b64/spec/ffi/fixtures/compile.rb#L11), we end up with OP’s error message.
The solution is, therefore, to get a version of Ruby built specifically for arm64 by using either Homebrew, rbenv or RVM.
For Homebrew:
- Execute
brew install ruby
- Add
export PATH=/opt/homebrew/opt/ruby/bin:/opt/homebrew/lib/ruby/gems/3.0.0/bin:$PATH
to your.zshrc
(you can find your Homebrew installation directory with$(brew --prefix)
if needed) - Execute
source ~/.zshrc
or restart your shell - Make sure you are using the correct
ruby
binary by executingwhich ruby
(should be$(brew --prefix)/opt/ruby/bin/ruby
) - Install CocoaPods with
sudo gem install cocoapods
- Make sure you are using the correct
pod
binary by executingwhich pod
(should be$(brew --prefix)/lib/ruby/gems/3.0.0/bin/pod
) - Make sure
ethon
is version 0.13.0 or more withgem info ethon
, otherwise runsudo gem install ethon
- Run
pod install
Ruby won't come with future macOS versions by default
Moreover, it should be noted that ruby
is still included in macOS only « for compatibility with legacy software », as evidenced by running irb -v
, so this is probably a good opportunity to install your own version anyway:
WARNING: This version of ruby is included in macOS for compatibility with legacy software. In future versions of macOS the ruby runtime will not be available by default and may require you to install an additional package.
irb 1.0.0 (2018-12-18)
Sources:
Solution 4:[4]
To install completely cocoapods on Mac with M1 chip (Apple Silicon), please follow these steps:
- Duplicate the Terminal application in the Utilities folder.
- Right-click on the app and choose to Get Info.
- Rename the other version of the app as you like.
- Check the option "open with Rosetta".
- Install Cocoapods with the command "sudo gem install cocoapods"
- Type the command line "gem install ffi" to fix the ffi bundle problem. Now you can do a "pod install" without a problem.
Source : iPhoneSoft
Solution 5:[5]
Simplest way I found :
sudo gem uninstall cocoapods
brew install cocoapods
Solution 6:[6]
An alternative to running Terminal in Rosetta 2 is to set the architecture with arch -x86_64
, as in the following:
arch -x86_64 sudo gem install cocoapods -n /usr/local/bin
To give credit where it is due, I found this solution here
MacPorts bug tracker, issue #61545, comment 7
Solution 7:[7]
Execute below to install the required ffi :
sudo arch -x86_64 gem install ffi
Instead of
pod install
use :arch -x86_64 pod install
Solution 8:[8]
There is a much "better/easier?" way by way of using homebrew now that waters have settled, if you have homebrew install just run
brew install cocoapods
this will install ruby and libyaml as preconditions, so far this is the most straightforward way (and the one, most probably, to be recommended moving forward).
Solution 9:[9]
UPDATE 28th MARCH
1- arch -x86_64 sudo gem install cocoapods -n /usr/local/bin
2- arch -x86_64 sudo gem install ffi
3- pod install
No need to duplicate or Open with Rosetta
Solution 10:[10]
Working in Sept 2021, Mac M1
I just want to add to Medhi's answer, to do a "pod repo update" within the same terminal inside the iOS folder, because that was critically fixing the error for me.
Here's the complete To-do-list:
Duplicate the Terminal application in the Utilities folder.
Right click on the app and choose "Get Info".
Rename the other version of the app as you like.
Check the option "open with Rosetta".
Install Cocoapods with the command
sudo gem install cocoapods
Type the command line
sudo gem install ffi
to fix the ffi bundle problem.Go to the iOS folder of your app in the same terminal
Do
pod repo update
Now you can do a
pod install
without a problem.
Solution 11:[11]
Basically tried all solutions listed here.
$ arch -arm64 brew install cocoapods
finally did it for me.
Before doing that, be sure to have homebrew correctly installed with /opt/homebrew
being the prefix. This article provides pretty good instructions on this.
Edit: Another option is to remove all your flutter and dart files and just use homebrew for the complete installation process as shown here. This also worked for me on M1 Pro.
Solution 12:[12]
Install cocoapods
sudo arch -x86_64 gem install ffi
Install pod file
arch -x86_64 pod install
Update pod
arch -x86_64 pod update
Solution 13:[13]
Try $ sudo gem install ffi. It works fine for me.
Solution 14:[14]
I had the same issue and this is what helped me. Open the terminal and type the below command :
arch -x86_64 sudo gem install ffi
Solution 15:[15]
As of version 1.10.1
Jan 7, 2021, CocoaPods is now supporting the new M1 chip.
Solution 16:[16]
If your case is that you've updated your project and already have ffi installed, you will need to run this:
arch -x86_64 pod install --repo-update
Solution 17:[17]
This is how I solved my problem in M1. Someone might be helped.
From System preference. User & group. Set login shell as
/bin/bash
Then close the terminal and reopen it.run this command
sudo gem install -n /usr/local/bin cocoapods -v 1.8.4
Hopefully, this will works.
Solution 18:[18]
? The following solution work for me on my Apple M1 machine.
I've spent over a week searching for a solution to install CocoaPods successfully on a M1 machine. You may see if my method works for you or not. ?
The solution requires the Terminal.app to be running in "Rosetta" mode.
But it does not required the Terminal to be running in x86.
[Environment]
Mac mini (M1, 2020) / macOS Big Sur (Version 11.5.2) / Xcode Version 13.0 (13A233)
Terminal + Rosetta
(Rosetta is required on CocoaPods installation)
To run the terminal.app in "Rosetta" mode,
Right click the Terminal.app > Select "Get Info" > Make sure "Open using Rosetta" is checked.
Steps
(1) Run the following lines for updating gem.
Make sure you gem version is up-to-date before executing any commands following. The update is introduced by this article on Medium.
sudo gem update -n /usr/local/bin --system
sudo gem install -n /usr/local/bin cocoapods --pre
(2) Execute the commands using the "sudo" command.
sudo gem install
(3) Install an older version of CocoaPods
As the latest version (1.10.0) cannot be installed for my case. I've tried installing an older version. The line execute successfully without any error messages.
You may check the thread on Apple's forum.
sudo gem install -n /usr/local/bin cocoapods -v 1.8.4
Solutions on Error
Then, the compiler may bring you some error, like "active developer path do not exist". This error would shown if you've installed a beta version of Xcode on your machine.
You would need run following lines for the compiler to switch to a new active path, pointing to the new Xcode app.
sudo xcode-select --switch ?Applications/Xcode.app/Contents/Developer
If your Xcode refuses to switch, you may check out this thread on Apple's forum to see if it helps.
Final Step ??
(1) Uncheck "Open using Rosetta"
Then, may go back to the "info" panel and uncheck "Open using Rosetta", but unchecking Rosetta is optional. You may keep the box checked if it is needed.
(2) Run CocoaPods commands as usual
After that, you can back to the project directory and run commands pod init
to initiate the CocoaPods for your project as usual
Steps for a normal CocoaPods build:
pod init
open Podfile
edit Podfile
(for specifying pods)pod install
- The .xcworkspace is ready to be opened in Xcode.
Use sudo xcodebuild -license
if you've faced an error (regarding to Xcode registration).
Solution 19:[19]
I've been having the same issue. I did find that the cocoa pods UI app seems to work as expected.
Solution 20:[20]
this is what i got when trying to instal ffi in native terminal:
Fetching ffi-1.13.1.gem
Building native extensions. This could take a while...
ERROR: Error installing ffi:
ERROR: Failed to build gem native extension.
current directory: /Library/Ruby/Gems/2.6.0/gems/ffi-1.13.1/ext/ffi_c
switching to Rosetta enabled terminal, installing "gem install cocoapods" fails on
You don't have write permissions for the /usr/bin directory.
but then installation of ffi was successful...
Finally solved it with
sudo gem install cocoapods -n /usr/local/bin
Solution 21:[21]
IN MAC M1, for anyone using KMM (Kotlin Multiplatform Mobile), but it may work for other, finding that it does not create files on the .xcworkspace
for the iOS APP, when using CocoaPods as dependency manager, first install CocoaPods by typing
sudo gem install cocoapods
than navigate to your project folder, now on the iOS folder and type
sudo arch -x86_64 gem install ffi
arch -x86_64 pod install
Now you should find all the files in iOS workspace. If you have problems with
/Users/$name/$directory/$projectName/$iosFolderName/$iosAppName.xcodeproj
The linked and embedded framework 'Pods_iosApp.framework' is missing one or more architectures required by this target: x86_64.
You need to add arm64 to xCode, click on the project folder -> Build Settings -> and search for Excluded Architectures and add arm64
Solution 22:[22]
Install pod in project without using rosetta terminal just follow below steps
- sudo arch -x86_64 gem install ffi
- arch -x86_64 pod install
Solution 23:[23]
Pod Not installing on M1 Chip MAC ??? No worries
run below three commands : -
pod deintegrate
sudo arch -x86_64 gem install ffi
arch -x86_64 pod install
it works !!
Solution 24:[24]
Mac M1 MacOS BigSur solution:
brew cleanup -d -v
brew install cocoapods
brew link --overwrite cocoapods
Solution 25:[25]
For updating pods, maybe someone will help:
After installing ffi:
sudo arch -x86_64 gem install ffi
Update dependencies
arch -x86_64 pod update
Solution 26:[26]
I did get this problem after new dependencies (Firebase) where added to the repo. Was then able to do the sudo arch -x86_64 gem install ffi, but other problems remained after it.
My fix was: re-cloning the repo and running it again.
Setup: Xcode 12.4 Mac M1 react-native 63.4
Solution 27:[27]
I have a twist to this answer:
- run
sudo gem install ffi
- the twist: I restarted my machine and then it worked.
Solution 28:[28]
I had the same problem with my new MacBook Air M1 just because m1 has a different architecture we should install packages with Rosetta Translation Environment.
You can solve most compatibilities by using rosetta.
STEPS TO SOLVE:
- Open finder/applications
- Duplicate your terminal
- Right-click the new terminal and check the checkbox [x] open using
Solution 29:[29]
the solution for me was to add arch -x86_64 at the begining of the create command
Solution 30:[30]
This is what worked for me, trying to build app on Mac M1
first go to your applications
folder and
select terminal
app -> get info -> select run with rosseta
// if you are trying to build the app through xcode
Repeat the above steps for xcode
app
Note: Make sure your terminal and code are closed while doing so.
Now run your terminal switch to your project_folder/ios
Run below-shown commands
sudo gem install cocoapods
sudo gem install ffi
sudo arch -x86_64 gem install ffi
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow