Amod Mishra
Amod Mishra

Reputation: 1

Build error with bit code enabled; ld: -bundle and -bitcode_bundle (Xcode setting ENABLE_BITCODE=YES) cannot be used together

I have a pod project, containing an example that demonstrates the usage of the pod. The bitcode enabled setting is set to yes, both on the example and Pod targets. The following is the Podfile of the example:

use_frameworks!
platform :ios, '10.0'

target 'MyPod_Example' do
  pod 'MyPod', :path => '../'

  target 'MyPod_Tests' do
    inherit! :search_paths


  end
end

The example app runs well on the Simulator, but while trying to run it on an iPhone 6S, I get the following build error:

ld: -bundle and -bitcode_bundle (Xcode setting ENABLE_BITCODE=YES) cannot be used together clang: error: linker command failed with exit code 1 (use -v to see invocation).

How do I fix this? Another project that I have that has the same pod, but downloads the pod from its repo works fine on iPhone, with bitcode enabled. The following shows the Podfile structure of the app that works:

source '<my pod spec repo>'
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '10.0'

target 'MyPodTest' do

  use_frameworks!

  # Pods for MyPodTest
    pod 'MyPod'

  target 'MyPodTestTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'MyPodTestUITests' do
    inherit! :search_paths
    # Pods for testing
  end

end

Upvotes: 0

Views: 620

Answers (1)

stevendesu
stevendesu

Reputation: 16841

The -bitcode_bundle flag being passed to ld is described in the error message ("Xcode setting ENABLE_BITCODE=YES"), but the -bundle flag is not, which can make this confusing and hard to debug.

If you look at the lines preceding this error, you will likely see two important ones:

  • WriteAuxiliaryFile /Users/YOURUSER/Library/Developer/Xcode/DerivedData/YOURPROJECT-xxxxx/Build/Intermediates.noindex/YOURPROJECT.build/Release-SDK/TARGET.build/DerivedSources/TARGET_vers.c (in target 'TARGET' from project 'YOURPROJECT')
  • CompileC /Users/YOURUSER/Library/Developer/Xcode/DerivedData/YOURPROJECT-xxxxx/Build/Intermediates.noindex/YOURPROJECT.build/Release-SD/TARGET.build/Objects-normal/arm64/TARGET_vers.o /Users/YOURUSER/Library/Developer/Xcode/DerivedData/YOURPROJECT-xxxxx/Build/Intermediates.noindex/YOURPROJECT.build/Release-SDK/TARGET.build/DerivedSources/TARGET_vers.c normal arm64 c com.apple.compilers.llvm.clang.1_0.compiler (in target 'TARGET' from project 'YOURPROJECT')

These two lines are the real meat of your problem. Your bundle, which formerly had no binary files in it (only PNGs, XIBs, and other resources), now has a binary file. One that was created by Xcode. Because this binary was created as part of a resource bundle target, it's compiled as a CFBundleExecutable using the -bundle flag, which is incompatible with ENABLE_BITCODE. Instead of disabling bitcode, though, you should prevent this binary from being generated in the first place.

This binary is being created by Apple Generic Versioning. To get rid of it, go to your build settings tab (on your resource bundle target), click the "all" button to see all settings, then search for "versioning system". Change this from "Apple Generic" to "None". Resource bundles do not properly support versioning.

Upvotes: 7

Related Questions