143
votes

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?

21
Was unable to get it working without rosetta following the accepted answer, on a new M1 mac mini. Once installed via rosetta, its probably still running in compatibility mode, even if rosetta is later turned off. The correct answer is Valentin Briand's answer below. A very outdated version of Ruby is installed on Macs by default. Whats needed is to install a newer ruby (easiest via homebrew), config terminal to use that version and then just install cocoapods as normal - Simon McLoughlin

21 Answers

227
votes

Still working in September 2021

#1 Install ffi

sudo arch -x86_64 gem install ffi

#2 Re-install dependencies

arch -x86_64 pod install
176
votes

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:

  1. Right-click on Terminal in Finder
  2. Get Info
  3. 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.

55
votes

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 with which 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 sure ethon 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 executing which 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 executing which pod (should be $(brew --prefix)/lib/ruby/gems/3.0.0/bin/pod)
  • Make sure ethon is version 0.13.0 or more with gem info ethon, otherwise run sudo 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:

46
votes

To install completely cocoapods on Mac with M1 chip (Apple Silicon), please follow these steps:

  1. Duplicate the Terminal application in the Utilities folder.
  2. Right-click on the app and choose to Get Info.
  3. Rename the other version of the app as you like.
  4. Check the option "open with Rosetta".
  5. Install Cocoapods with the command "sudo gem install cocoapods"
  6. 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

14
votes

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

6
votes

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

5
votes
  1. Execute below to install the required ffi :

    sudo arch -x86_64 gem install ffi

  2. Instead of pod install use :

    arch -x86_64 pod install

3
votes

Try $ sudo gem install ffi. It works fine for me.

3
votes

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
3
votes

As of version 1.10.1 Jan 7, 2021, CocoaPods is now supporting the new M1 chip.

2
votes

I've been having the same issue. I did find that the cocoa pods UI app seems to work as expected.

2
votes

Install cocoapods

sudo arch -x86_64 gem install ffi

Install pod file

arch -x86_64 pod install

Update pod

arch -x86_64 pod update
2
votes

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

1
votes

Install pod in project without using rosetta terminal just follow below steps

  • sudo arch -x86_64 gem install ffi
  • arch -x86_64 pod install
1
votes

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:

  1. Duplicate the Terminal application in the Utilities folder.

  2. Right click on the app and choose "Get Info".

  3. Rename the other version of the app as you like.

  4. Check the option "open with Rosetta".

  5. Install Cocoapods with the command sudo gem install cocoapods

  6. Type the command line sudo gem install ffi to fix the ffi bundle problem.

  7. Go to the iOS folder of your app in the same terminal

  8. Do pod repo update

  9. Now you can do a pod install without a problem.

0
votes

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
0
votes

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

0
votes

I have a twist to this answer:

  1. run
sudo gem install ffi
  1. the twist: I restarted my machine and then it worked.
0
votes

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:

  1. Open finder/applications
  2. Duplicate your terminal
  3. Right-click the new terminal and check the checkbox [x] open using

and then install packages with this terminal enter image description here

-1
votes

If you are on an older project that needs to be ported over don't forget to update the project.pbxproj files in your Runner.xcodeproj and Pods.xcodeproj.

The IPHONEOS_DEPLOYMENT_TARGET probably is still pointed towards 8.0

Update all occurrences as follows:

IPHONEOS_DEPLOYMENT_TARGET = 9.0;
-1
votes

For updating pods, maybe someone will help:

After installing ffi:

sudo arch -x86_64 gem install ffi

Update dependencies

arch -x86_64 pod update