Tampaknya kita dapat - secara teoritis - membangun perpustakaan statis tunggal yang mencakup simulator dan iPhone dan iPad.
Namun, Apple tidak memiliki dokumentasi mengenai hal ini yang dapat saya temukan, dan templat default Xcode TIDAK dikonfigurasikan untuk melakukan ini.
Saya mencari teknik sederhana, portabel, dapat digunakan kembali yang dapat dilakukan di dalam Xcode.
Beberapa sejarah:
- Pada 2008, kami dulunya bisa membuat satu static-libs yang mencakup sim dan perangkat. Apple menonaktifkannya.
- Sepanjang 2009, kami membuat pasang lib statis - satu untuk sim, satu untuk perangkat. Apple sekarang telah menonaktifkannya juga.
Referensi:
Ini adalah ide yang bagus, ini pendekatan yang sangat baik, tetapi tidak berhasil: http://www.drobnik.com/touch/2010/04/universal-static-libraries/
- Ada beberapa bug dalam skripnya yang artinya hanya berfungsi pada mesinnya - ia harus menggunakan BUILT_PRODUCTS_DIR dan / atau BUILD_DIR alih-alih "menebak-nebak" mereka)
- Xcode terbaru Apple mencegah Anda melakukan apa yang telah ia lakukan - itu tidak akan berfungsi, karena (Dokumentasi) perubahan dalam cara Xcode memproses target)
Penanya SO lain bertanya bagaimana melakukannya TANPA xcode, dan dengan tanggapan yang difokuskan pada bagian arm6 vs arm7 - tetapi mengabaikan bagian i386: Bagaimana cara saya mengkompilasi perpustakaan statis (lemak) untuk armv6, armv7 dan i386
- Karena perubahan terbaru Apple, bagian Simulator tidak sama dengan perbedaan arm6 / arm7 - ini adalah masalah yang berbeda, lihat di atas)
Jawaban:
ALTERNATIF:
Mudah menyalin / menempel versi terbaru (tetapi instruksi pemasangan dapat berubah - lihat di bawah!)
Perpustakaan Karl membutuhkan lebih banyak upaya untuk mensetup, tetapi solusi jangka panjang yang jauh lebih bagus (itu mengubah perpustakaan Anda menjadi Kerangka Kerja).
Gunakan ini, kemudian atur untuk menambahkan dukungan untuk Archive build - cf @ Frederik berkomentar di bawah ini tentang perubahan yang dia gunakan untuk menjadikan ini berfungsi dengan baik dengan mode Archive.
PERUBAHAN TERAKHIR: 1. Menambahkan dukungan untuk iOS 10.x (sambil mempertahankan dukungan untuk platform yang lebih lama)
Info tentang cara menggunakan skrip ini dengan proyek-embedded-in-another-project (walaupun saya sangat merekomendasikan TIDAK melakukan hal itu, Apple - ada beberapa bug show-stopper di Xcode jika Anda menanamkan proyek di dalam satu sama lain, dari Xcode 3.x hingga Xcode 4.6.x)
Skrip bonus untuk memungkinkan Anda menyertakan Bundel secara otomatis (yaitu, sertakan file PNG, file PLIST dll dari perpustakaan Anda!) - lihat di bawah (gulir ke bawah)
sekarang mendukung iPhone5 (menggunakan solusi Apple untuk bug di lipo). CATATAN: petunjuk pemasangan telah berubah (Saya mungkin dapat menyederhanakan ini dengan mengubah skrip di masa depan, tetapi tidak ingin mengambil risiko sekarang)
Bagian "copy header" sekarang menghormati pengaturan bangunan untuk lokasi header publik (milik Frederik Wallner)
Menambahkan pengaturan eksplisit SYMROOT (mungkin perlu OBJROOT diatur juga?), Terima kasih kepada Doug Dickinson
SCRIPT (ini yang harus Anda salin / tempel)
Untuk petunjuk penggunaan / instal, lihat di bawah
INSTAL INSTRUKSI
... Penggunaan BONUS OPTIONAL:
Jika Anda tidak dapat menemukan file output, berikut ini solusinya:
Tambahkan kode berikut ke bagian paling akhir dari skrip (milik Frederik Wallner): buka "$ {CREATING_UNIVERSAL_DIR}"
Apple menghapus semua output setelah 200 baris. Pilih Target Anda, dan dalam Fase Skrip Jalankan, Anda HARUS menghapus centang: "Tampilkan variabel lingkungan dalam log bangunan"
jika Anda menggunakan direktori "build output" khusus untuk XCode4, maka XCode menempatkan semua file "tak terduga" Anda di tempat yang salah.
... itu adalah lokasi Universal Build Anda.
Cara memasukkan file "non-kode sumber" dalam proyek Anda (PNG, PLIST, XML, dll)
Script untuk menyalin secara otomatis bundel bawaan ke folder yang sama dengan pustaka statis FAT Anda:
sumber
Saya telah menghabiskan banyak waktu mencoba membangun perpustakaan statis yang gemuk yang akan bekerja pada armv7, armv7s, dan simulator. Akhirnya ditemukan solusinya .
Intinya adalah untuk membangun dua perpustakaan (satu untuk perangkat dan kemudian satu untuk simulator) secara terpisah, mengubah nama mereka untuk membedakan satu sama lain, dan kemudian lipo-buat mereka menjadi satu perpustakaan.
Saya mencobanya dan berhasil!
sumber
Saya telah membuat templat proyek XCode 4 yang memungkinkan Anda membuat kerangka universal semudah membuat perpustakaan biasa.
sumber
Ada utilitas baris perintah
xcodebuild
dan Anda dapat menjalankan perintah shell dalam xcode. Jadi, jika Anda tidak keberatan menggunakan skrip khusus, skrip ini dapat membantu Anda.Mungkin terlihat tidak efisien (saya tidak pandai skrip shell), tetapi mudah dimengerti. Saya mengkonfigurasi target baru yang hanya menjalankan skrip ini. Script ini dirancang untuk baris perintah tetapi tidak diuji dalam :)
Konsep inti adalah
xcodebuild
danlipo
.Saya mencoba banyak konfigurasi dalam Xcode UI, tetapi tidak ada yang berhasil. Karena ini adalah semacam pemrosesan batch, maka desain baris perintah lebih cocok, sehingga Apple menghapus fitur pembuatan batch dari Xcode secara bertahap. Jadi saya tidak berharap mereka menawarkan fitur batch build berbasis UI di masa depan.
sumber
Saya membutuhkan lib statis statis untuk JsonKit sehingga menciptakan proyek lib statis di Xcode dan kemudian menjalankan skrip bash ini di direktori proyek. Selama Anda telah mengkonfigurasi proyek xcode dengan "Hanya membangun konfigurasi aktif" dimatikan, Anda harus mendapatkan semua arsitektur dalam satu lib.
sumber
Pembaruan IOS 10:
Saya punya masalah dengan membangun fatlib dengan iphoneos10.0 karena ekspresi reguler dalam script hanya mengharapkan 9.x dan lebih rendah dan mengembalikan 0,0 untuk ios 10.0
untuk memperbaiki ini ganti saja
dengan
sumber
Saya telah membuat ini menjadi templat Xcode 4 , dengan nada yang sama dengan templat kerangka kerja statis Karl.
Saya menemukan bahwa membangun kerangka kerja statis (bukan perpustakaan statis biasa) menyebabkan crash acak dengan LLVM, karena bug penghubung yang jelas - jadi, saya kira perpustakaan statis masih berguna!
sumber
Kerja bagus! Saya meretas bersama sesuatu yang serupa, tetapi harus menjalankannya secara terpisah. Setelah itu hanya menjadi bagian dari proses pembuatan membuatnya jauh lebih sederhana.
Satu item catatan. Saya perhatikan bahwa itu tidak menyalin semua file yang Anda tandai sebagai publik. Saya telah menyesuaikan apa yang saya miliki dalam naskah saya dengan naskah Anda dan itu bekerja dengan cukup baik. Rekatkan yang berikut ke bagian akhir skrip Anda.
sumber
Saya sebenarnya hanya menulis skrip saya sendiri untuk tujuan ini. Itu tidak menggunakan Xcode. (Ini didasarkan pada skrip yang serupa dalam proyek Skema Gambit.)
Pada dasarnya, ini berjalan ./configure dan buat tiga kali (untuk i386, armv7, dan armv7s), dan gabungkan masing-masing pustaka yang dihasilkan menjadi lib lemak.
sumber