Bitcode etkinleştirilmiş bir statik kitaplığı nasıl xcodebuildim?


89

Xcode 7 , bir tür LLVM ara ikili olan Bitcode'u sunar ; bu, Apple'ın sunucularının benim müdahalem olmadan farklı mimariler için uygulamamı yeniden derleyebileceği anlamına gelir.

Lookback'te, kütüphanemizle statik bir arşiv çerçevesi dağıtıyorum. Görünüşe göre "Oluştur ve Arşivle" dışında herhangi bir şeyle derleme yaptığınızda, bit kodu aslında kitaplığıma gönderilmiyor ve uygulamalarında kitaplığıma bağlanan ve Bitcode etkinleştirilmiş bir Derleme ve Arşiv yapmaya çalışan herkes şunlardan birini alacak: iki uyarı:

  • ld: 'Lookback(Lookback.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. (lib Xcode 6 ile oluşturulmuşsa)
  • ld: warning: full bitcode bundle could not be generated because 'Lookback(Lookback.o)' was built only with bitcode marker. The library must be generated from Xcode archive build with bitcode enabled (Xcode setting ENABLE_BITCODE) (lib normal bir xcodebuild ile Xcode 7 ile oluşturulmuşsa)

Bir cihaz + simülatör evrensel ikili dosyası oluşturan bir derleme komut dosyam var, bu yüzden Build & Archive'ı kullanamıyorum, bunun yerine xcodebuildkomut satırımdan komut satırından çalıştırıyorum . Nasıl xcodebuilddüzgün bir bit kodu etkin kitaplık oluşturabilirim?


HI @nevyn SDK'nızı bit kodu kullanan bir uygulamada derlemeye çalışıyorum. Bir yolu var mı?
Stoff81

@ Stoff81 Üzgünüm, üzerinde çalışıyorum. Öncelikle tüm bağımlılıklarımın Bitcode ile çalışmasını sağlamam gerekiyor ve bu epey bir iş.
nevyn

Yanıtlar:


137

Bitcode, bir derleme zamanı özelliğidir (bir bağlantı zamanı özelliği değildir), bu da her .o dosyasının bitcode ile oluşturulduğunda __bitcode adlı fazladan bir bölüm içermesi gerektiği anlamına gelir. Çalıştırarak ikili programınızın bit kodu uyumlu olup olmadığını doğrulayabilirsiniz otool -l (my .o or .a file) | grep __LLVM.

Normal olarak derlediğinizde, Xcode -fembed-bitcode-markerherhangi bir clang çağrısına yapı bayrağını ekler . Bu, bir tür 'bit kodu etkinleştirildiyse bit kodunun gideceği yer' gibi görünüyor ve aslında bit kodunu etkinleştirmiyor.

"Build & Archive" yaptığınızda, bu bayrağın yerini -fembed-bitcode, gerçekten Bitcode etkin bir ikili dosya oluşturan ile değiştirilir.

Yapmak için iki yol var gibi görünüyor xcodebuildkullanımı -fembed-bitcode:

  • Yerine olduğu gibi 'arşivle' eylemini xcodebuild -target LookbackSDK archivekullanın xcodebuild -target LookbackSDK build. Bu, ikili dosyaları build/klasör yerine Xcode Düzenleyicinize koymanın yan etkisine sahiptir , ancak bunu kullanarak -exportArchive -archivePath ./build(teşekkürler @JensAyton )
  • İle Diğer C Bayrakları ekleyerek bayrağın kullanımını zorlayın OTHER_CFLAGS="-fembed-bitcode". Sizin xcodebuildçağırma gibi bir şey olur xcodebuild OTHER_CFLAGS="-fembed-bitcode" -target LookbackSDK build.

İkincisi, derleme sistemimi değiştirmeme gerek kalmaması için seçtiğim şeydir, ancak artık her dosya için uyarılar üretecek -fembed-bitcode-markerve -fembed-bitcodeclang'a gönderilecek. Luckilly, Bitcode özellikli bir kitaplık oluşturarak kazanır!

Kaynaklar


9
FWIW, -fembed-bitcode-markergöz ardı edilme uyarısını da ekleyerek kurtulabilirsiniz -Qunused-arguments.
mstorsjo

Bir çerçevenin xcodebuild'i için hangi exportFormat kullanılır? Yalnızca "ipa", "pkg" ve "uygulama" tanımlanmış gibi görünüyor ( developer.apple.com/library/mac/documentation/Darwin/Reference/… ).
Fabian Köbel

@nevyn Yine de yukarıda belirtilen bayrakla birlikte bir yapı betiği içeren özel çerçeve dosyasına sahip ana uygulamamı oluşturamadı.
ravoorinandan

otool -l (benim .o veya .a dosyam). Otool -l (benim .o veya .a dosyam) | grep __bitcode?
Mike M

1
@MikeM aslında hayır otool -l myfile.o | grep __LLVM, çünkü orada gerçek bit kodu yerine sadece bit kodu işaretçisi olsa bile bir __bitcode segmenti olacaktır.
nevyn

41

Xcode 8 OTHER_CFLAGS="-fembed-bitcode"ile işe gidemedim . was built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install buildStatik çerçevemi içeren bir uygulamanın Arşiv yapısını oluşturmaya çalıştığım zamanlardaki gibi bir şeyle karşılaştım .

Gerçekten aradığım şey şuydu:

BITCODE_GENERATION_MODE=bitcode

Aslında bir toplu hedefin içinde bir Çalıştırma Komut Dosyası kullanıyorum, tam xcodebuild satırı şuna benziyor (sadece referans için):

xcodebuild BITCODE_GENERATION_MODE=bitcode OTHER_CFLAGS="-fembed-bitcode" -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build


2
+1, bu cevapta da BITCODE_GENERATION_MODE=bitcodeönerildiği gibi yöntem tercih edilmiş gibi görünüyor .
William Denniss

Bu aynı zamanda sorunumu çözdü, oysa varsayılan cevap artık değil.
Kamçatka

Hayat kurtarıcı! Teşekkür ederim!
vidalbenjoe

17

Statik kitaplık için bit kodu desteği eklediğinizde, Xcode 6 ile uyumlu olmayacaktır. Uygulama arşivlenmeyecek.

@ Nevyn'in cevabı beni biraz şaşırttığı için bitcode ayarından açıkça bahsetmek istiyorum.

Derleme ayarlarına gidin, "özel derleyici bayrakları" arayın. Ekle -fembed-bitcode. Bu, kitaplığınızı bitcode ile oluşturacaktır.


6

Derleme Ayarlarında proje seçin -> Diğer C bayrakları, Hata Ayıklama'yı -fembed-bitcode-marker ve Release'i -fembed-bitcode olarak ayarlayın

Derleme Ayarlarında, BITCODE_GENERATION_MODE adıyla kullanıcı tanımlı bir yapı ayarı eklemek için üstteki + işaretine tıklayın ve Hata Ayıklamayı işaretleyici, Yayınla bit koduna ayarlayın

Şemayı Release olarak düzenleyin Sonra istenen kitaplığa tıklayın. Bir dosya ve derleme yolunu alın. Kitaplık formu Yayın klasörünü alın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.