Xcode 7 memperkenalkan Bitcode , yang merupakan semacam biner perantara LLVM yang berarti server Apple dapat mengkompilasi ulang aplikasi saya untuk arsitektur yang berbeda tanpa keterlibatan saya.
Di Lookback, saya mendistribusikan kerangka arsip statis dengan perpustakaan kami. Tampaknya ketika Anda membangun dengan apa pun kecuali "Bangun & Arsip", bitcode sebenarnya tidak dipancarkan ke perpustakaan saya, dan siapa pun yang menautkan dengan perpustakaan saya di aplikasi mereka dan mencoba melakukan Bangun & Arsip dengan Bitcode diaktifkan akan mendapatkan salah satu dua peringatan:
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.
(jika lib dibangun dengan Xcode 6)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)
(jika lib dibangun dengan Xcode 7 dengan xcodebuild normal)
Saya memiliki skrip build yang membangun biner universal perangkat + simulator, jadi saya tidak dapat menggunakan Build & Archive, tetapi saya menjalankan xcodebuild
dari baris perintah dari skrip saya. Bagaimana cara membuat xcodebuild
pustaka berkemampuan bitcode yang tepat?
Jawaban:
Bitcode adalah fitur waktu kompilasi (bukan fitur waktu tautan) yang berarti bahwa setiap file .o harus berisi bagian tambahan yang disebut __bitcode saat dibuat dengan bitcode. Anda dapat mengonfirmasi apakah biner Anda kompatibel dengan bitcode dengan menjalankan
otool -l (my .o or .a file) | grep __LLVM
.Saat Anda membangun secara normal, Xcode menambahkan bendera build
-fembed-bitcode-marker
ke permintaan clang apa pun. Ini sepertinya semacam 'ini adalah tempat bitcode akan pergi, jika bitcode diaktifkan', dan tidak benar-benar mengaktifkan bitcode.Saat Anda "Membangun & Mengarsipkan", tanda ini diganti dengan
-fembed-bitcode
, yang benar-benar membangun biner yang mendukung Bitcode.Tampaknya ada dua cara untuk
xcodebuild
memanfaatkan-fembed-bitcode
:xcodebuild -target LookbackSDK archive
bukanxcodebuild -target LookbackSDK build
. Ini memiliki efek samping menempatkan binari di Xcode Organizer Anda alih-alihbuild/
folder, meskipun Anda dapat mengatasinya dengan menggunakan-exportArchive -archivePath ./build
(terima kasih @JensAyton )OTHER_CFLAGS="-fembed-bitcode"
.xcodebuild
Doa Anda akan terlihat seperti inixcodebuild OTHER_CFLAGS="-fembed-bitcode" -target LookbackSDK build
.Yang terakhir adalah apa yang saya pilih sehingga saya tidak perlu mengubah sistem build saya, tetapi ini akan menghasilkan peringatan untuk setiap file, karena sekarang keduanya
-fembed-bitcode-marker
dan-fembed-bitcode
dikirim ke dentang. Luckilly yang terakhir menang, menghasilkan pustaka yang mendukung Bitcode!Sumber daya
sumber
-fembed-bitcode-marker
diabaikan dengan menambahkan-Qunused-arguments
juga.otool -l myfile.o | grep __LLVM
, karena akan ada segmen __bitcode meskipun hanya ada penanda bitcode di sana, bukan bitcode asli.Dengan Xcode 8, saya tidak bisa mulai
OTHER_CFLAGS="-fembed-bitcode"
bekerja. Saya terus mengalami sesuatu di sepanjang bariswas built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install build
ketika saya mencoba membuat arsip build dari aplikasi yang berisi kerangka statis saya.Apa yang sebenarnya saya cari adalah ini:
BITCODE_GENERATION_MODE=bitcode
Saya sebenarnya menggunakan Run Script di dalam target agregat, baris xcodebuild lengkap terlihat seperti ini (hanya untuk referensi):
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
sumber
BITCODE_GENERATION_MODE=bitcode
metode tampaknya lebih disukai, seperti yang disarankan dalam jawaban ini juga.Setelah Anda menambahkan dukungan bitcode untuk lib statis, itu tidak akan kompatibel dengan Xcode 6. Aplikasi tidak akan mengarsipkan.
Saya ingin menyebutkan dengan jelas pengaturan untuk bitcode karena jawaban @ nevyn sedikit membingungkan saya.
Pergi ke Build settings, cari "custom compiler flags". Menambahkan
-fembed-bitcode
. Ini akan membangun lib Anda dengan bitcode.sumber
Pilih proyek Pada Pengaturan Build -> Bendera C lainnya, setel Debug ke -fembed-bitcode-marker dan Rilis ke -fembed-bitcode
Pada Build Settings, klik tanda + di bagian atas untuk menambahkan pengaturan build yang ditentukan pengguna dengan nama BITCODE_GENERATION_MODE, dan setel Debug ke penanda, Lepaskan ke bitcode
Edit skema sebagai Rilis Kemudian klik perpustakaan yang diinginkan. File dan dapatkan jalur build. Dapatkan folder rilis formulir perpustakaan.
sumber