Search code examples
iosxcodecocoapodsarm64xcode12

Xcode building for iOS Simulator, but linking in an object file built for iOS, for architecture 'arm64'


I am trying to get a large (and working on Xcode 11!) project building in Xcode 12 (beta 5) to prepare for iOS 14. The codebase was previously in Objective-C, but now it contains both Objective-C and Swift, and uses pods that are Objective-C and/or Swift as well.

I have pulled the new beta of CocoaPods with Xcode 12 support (currently 1.10.0.beta 2).

Pod install is successful. When I do a build, I get the following error on a pod framework:

building for iOS Simulator, but linking in object file built for iOS, for architecture arm64

and possibly also the error:

Unable to load standard library for target 'arm64-apple-ios11.0'

When I go run lipo -info on the framework, it has: armv7s armv7 i386 x86_64 arm64.

Previously, the project had Valid Architectures set to: armv7, armv7s and arm64.

In Xcode 12, that setting goes away, as per Apple's documentation. Architectures is set to $(ARCHS_STANDARD). I have nothing set in excluded architectures.

What may be going on here? I have not been able to reproduce this with a simpler project yet.


Solution

  • Basically, you have to exclude arm64 for the simulator architecture, both from your project and the Pod project.

    • To do that, navigate to Build Settings of your project and add Any iOS Simulator SDK with value arm64 inside Excluded Architecture.

      Enter image description here

    OR

    • If you are using custom XCConfig files, you can simply add this line for excluding simulator architecture.

      EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64
      

      Then

      You have to do the same for the Pod project until all the Cocoa pod vendors are done adding following in their Podspec.

      s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
      s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
      

      You can manually add the Excluded Architecture in your Pod project's Build Settings, but it will be overwritten when you use pod install.

      In place of this, you can add this snippet in your Podfile. It will write the necessary Build Settings every time you run pod install.

      post_install do |installer|
        installer.pods_project.build_configurations.each do |config|
          config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
        end
      end