Bangun pustaka statis yang gemuk (perangkat + simulator) menggunakan Xcode dan SDK 4+

283

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:

  1. 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)
  2. 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)
Adam
sumber
Hanya ingin tahu - mengapa Anda menginginkan itu? Bukankah itu membuat pustaka perangkat lebih besar dan lebih berat pada perangkat?
cregox
3
@ Cawas - "bobot" perpustakaan tidak relevan dalam 95% situasi dunia nyata - bagi sebagian besar dari kita, libnya kecil, terutama dibandingkan dengan misalnya menampilkan bahkan hanya satu UIImageView tunggal.
Adam
1
@Cawas - sementara itu, nilainya di sini adalah bahwa Anda JAUH lebih mudah bagi orang lain untuk menggunakan / menggunakan kembali perpustakaan Anda. Ini menjadi proses drag / drop satu tahap.
Adam
4
@Cawas - akhirnya, manfaat yang sangat mengejutkan: sangat mudah untuk secara tidak sengaja mengirim pustaka yang dikompilasi "salah" kepada seseorang - XCode melakukan nol pemeriksaan, dan dengan senang hati akan mengkompilasi arsitektur "salah" ke dalam file bernama yang Anda pikir "benar" Arsitektur. Apple terus melanggar Xcode di area ini - setiap versi baru memiliki perubahan yang berarti "tombol yang Anda tekan kemarin untuk mengkompilasi lib Anda dengan benar hari ini akan mengkompilasi dengan salah". Sampai Apple berhenti mengacaukan kita semua, kita perlu idiot-proof UI buruk mereka :).
Adam
1
Itu benar-benar hebat! Karena sekarang ini, kita tidak bisa mengandalkan simulator untuk hal yang sedikit lebih rumit.
cregox

Jawaban:

272

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)

  1. 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)

  2. 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)

  3. 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)

  4. Bagian "copy header" sekarang menghormati pengaturan bangunan untuk lokasi header publik (milik Frederik Wallner)

  5. 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

##########################################
#
# c.f. /programming/3520977/build-fat-static-library-device-simulator-using-xcode-and-sdk-4
#
# Version 2.82
#
# Latest Change:
# - MORE tweaks to get the iOS 10+ and 9- working
# - Support iOS 10+
# - Corrected typo for iOS 1-10+ (thanks @stuikomma)
# 
# Purpose:
#   Automatically create a Universal static library for iPhone + iPad + iPhone Simulator from within XCode
#
# Author: Adam Martin - http://twitter.com/redglassesapps
# Based on: original script from Eonil (main changes: Eonil's script WILL NOT WORK in Xcode GUI - it WILL CRASH YOUR COMPUTER)
#

set -e
set -o pipefail

#################[ Tests: helps workaround any future bugs in Xcode ]########
#
DEBUG_THIS_SCRIPT="false"

if [ $DEBUG_THIS_SCRIPT = "true" ]
then
echo "########### TESTS #############"
echo "Use the following variables when debugging this script; note that they may change on recursions"
echo "BUILD_DIR = $BUILD_DIR"
echo "BUILD_ROOT = $BUILD_ROOT"
echo "CONFIGURATION_BUILD_DIR = $CONFIGURATION_BUILD_DIR"
echo "BUILT_PRODUCTS_DIR = $BUILT_PRODUCTS_DIR"
echo "CONFIGURATION_TEMP_DIR = $CONFIGURATION_TEMP_DIR"
echo "TARGET_BUILD_DIR = $TARGET_BUILD_DIR"
fi

#####################[ part 1 ]##################
# First, work out the BASESDK version number (NB: Apple ought to report this, but they hide it)
#    (incidental: searching for substrings in sh is a nightmare! Sob)

SDK_VERSION=$(echo ${SDK_NAME} | grep -o '\d\{1,2\}\.\d\{1,2\}$')

# Next, work out if we're in SIM or DEVICE

if [ ${PLATFORM_NAME} = "iphonesimulator" ]
then
OTHER_SDK_TO_BUILD=iphoneos${SDK_VERSION}
else
OTHER_SDK_TO_BUILD=iphonesimulator${SDK_VERSION}
fi

echo "XCode has selected SDK: ${PLATFORM_NAME} with version: ${SDK_VERSION} (although back-targetting: ${IPHONEOS_DEPLOYMENT_TARGET})"
echo "...therefore, OTHER_SDK_TO_BUILD = ${OTHER_SDK_TO_BUILD}"
#
#####################[ end of part 1 ]##################

#####################[ part 2 ]##################
#
# IF this is the original invocation, invoke WHATEVER other builds are required
#
# Xcode is already building ONE target...
#
# ...but this is a LIBRARY, so Apple is wrong to set it to build just one.
# ...we need to build ALL targets
# ...we MUST NOT re-build the target that is ALREADY being built: Xcode WILL CRASH YOUR COMPUTER if you try this (infinite recursion!)
#
#
# So: build ONLY the missing platforms/configurations.

if [ "true" == ${ALREADYINVOKED:-false} ]
then
echo "RECURSION: I am NOT the root invocation, so I'm NOT going to recurse"
else
# CRITICAL:
# Prevent infinite recursion (Xcode sucks)
export ALREADYINVOKED="true"

echo "RECURSION: I am the root ... recursing all missing build targets NOW..."
echo "RECURSION: ...about to invoke: xcodebuild -configuration \"${CONFIGURATION}\" -project \"${PROJECT_NAME}.xcodeproj\" -target \"${TARGET_NAME}\" -sdk \"${OTHER_SDK_TO_BUILD}\" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO" BUILD_DIR=\"${BUILD_DIR}\" BUILD_ROOT=\"${BUILD_ROOT}\" SYMROOT=\"${SYMROOT}\"

xcodebuild -configuration "${CONFIGURATION}" -project "${PROJECT_NAME}.xcodeproj" -target "${TARGET_NAME}" -sdk "${OTHER_SDK_TO_BUILD}" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" SYMROOT="${SYMROOT}"

ACTION="build"

#Merge all platform binaries as a fat binary for each configurations.

# Calculate where the (multiple) built files are coming from:
CURRENTCONFIG_DEVICE_DIR=${SYMROOT}/${CONFIGURATION}-iphoneos
CURRENTCONFIG_SIMULATOR_DIR=${SYMROOT}/${CONFIGURATION}-iphonesimulator

echo "Taking device build from: ${CURRENTCONFIG_DEVICE_DIR}"
echo "Taking simulator build from: ${CURRENTCONFIG_SIMULATOR_DIR}"

CREATING_UNIVERSAL_DIR=${SYMROOT}/${CONFIGURATION}-universal
echo "...I will output a universal build to: ${CREATING_UNIVERSAL_DIR}"

# ... remove the products of previous runs of this script
#      NB: this directory is ONLY created by this script - it should be safe to delete!

rm -rf "${CREATING_UNIVERSAL_DIR}"
mkdir "${CREATING_UNIVERSAL_DIR}"

#
echo "lipo: for current configuration (${CONFIGURATION}) creating output file: ${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}"
xcrun -sdk iphoneos lipo -create -output "${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_DEVICE_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_SIMULATOR_DIR}/${EXECUTABLE_NAME}"

#########
#
# Added: StackOverflow suggestion to also copy "include" files
#    (untested, but should work OK)
#
echo "Fetching headers from ${PUBLIC_HEADERS_FOLDER_PATH}"
echo "  (if you embed your library project in another project, you will need to add"
echo "   a "User Search Headers" build setting of: (NB INCLUDE THE DOUBLE QUOTES BELOW!)"
echo '        "$(TARGET_BUILD_DIR)/usr/local/include/"'
if [ -d "${CURRENTCONFIG_DEVICE_DIR}${PUBLIC_HEADERS_FOLDER_PATH}" ]
then
mkdir -p "${CREATING_UNIVERSAL_DIR}${PUBLIC_HEADERS_FOLDER_PATH}"
# * needs to be outside the double quotes?
cp -r "${CURRENTCONFIG_DEVICE_DIR}${PUBLIC_HEADERS_FOLDER_PATH}"* "${CREATING_UNIVERSAL_DIR}${PUBLIC_HEADERS_FOLDER_PATH}"
fi
fi

INSTAL INSTRUKSI

  1. Buat proyek Lib statis
  2. Pilih Target
  3. Di tab "Bangun Pengaturan", set "Hanya Bangun Arsitektur Aktif" ke "TIDAK" (untuk semua item)
  4. Di tab "Bangun Fase", pilih "Tambahkan ... Fase Pembuatan Baru ... Fase Pembuatan Skrip Run Baru"
  5. Salin / rekatkan skrip (di atas) ke dalam kotak

... Penggunaan BONUS OPTIONAL:

  1. OPTIONAL: jika Anda memiliki header di perpustakaan Anda, tambahkan mereka ke fase "Copy Header"
  2. OPSIONAL: ... dan seret / jatuhkan dari bagian "Proyek" ke bagian "Publik"
  3. OPSIONAL: ... dan mereka akan secara OTOMATIS diekspor setiap kali Anda membangun aplikasi, ke dalam sub-direktori dari direktori "debug-universal" (mereka akan berada di usr / local / include)
  4. OPSIONAL: CATATAN: jika Anda juga mencoba untuk menyeret / jatuhkan proyek Anda ke proyek Xcode lain, ini memperlihatkan bug di Xcode 4, di mana ia tidak dapat membuat file .IPA jika Anda memiliki Public Header di proyek seret / jatuhkan Anda. Cara mengatasinya: jangan menyematkan proyek xcode (terlalu banyak bug dalam kode Apple!)

Jika Anda tidak dapat menemukan file output, berikut ini solusinya:

  1. Tambahkan kode berikut ke bagian paling akhir dari skrip (milik Frederik Wallner): buka "$ {CREATING_UNIVERSAL_DIR}"

  2. 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"

  3. jika Anda menggunakan direktori "build output" khusus untuk XCode4, maka XCode menempatkan semua file "tak terduga" Anda di tempat yang salah.

    1. Bangun proyek
    2. Klik ikon terakhir di kanan, di area kiri atas Xcode4.
    3. Pilih item teratas (ini adalah "build terbaru" Anda. Apple harus memilihnya secara otomatis, tetapi mereka tidak memikirkannya)
    4. di jendela utama, gulir ke bawah. Baris terakhir harus berbunyi: lipo: untuk konfigurasi saat ini (Debug) membuat file output: /Users/blah/Library/Developer/Xcode/DerivedData/AppName-ashwnbutvodmoleijzlncudsekyf/Build/Products/Debug-universal/libTargetName.a

    ... itu adalah lokasi Universal Build Anda.


Cara memasukkan file "non-kode sumber" dalam proyek Anda (PNG, PLIST, XML, dll)

  1. Lakukan semuanya di atas, periksa berhasil
  2. Buat fase Run Script baru yang datang SETELAH PERTAMA (salin / tempel kode di bawah)
  3. Buat Target baru dalam Xcode, ketik "bundle"
  4. Di PROYEK UTAMA Anda, di "Bangun Fase", tambahkan bundel baru sebagai sesuatu yang "tergantung pada" (bagian atas, tekan tombol plus, gulir ke bawah, cari file ".bundle" di Produk Anda)
  5. Di TARGET BUNDLE BARU Anda, di "Bangun Fase", tambahkan bagian "Salin Sumber Daya Bundel", dan seret / letakkan semua file PNG dll ke dalamnya

Script untuk menyalin secara otomatis bundel bawaan ke folder yang sama dengan pustaka statis FAT Anda:

echo "RunScript2:"
echo "Autocopying any bundles into the 'universal' output folder created by RunScript1"
CREATING_UNIVERSAL_DIR=${SYMROOT}/${CONFIGURATION}-universal
cp -r "${BUILT_PRODUCTS_DIR}/"*.bundle "${CREATING_UNIVERSAL_DIR}"
Adam
sumber
2
Saya telah menggunakan ini pada beberapa proyek sekarang, dan mengirimkan barang ke app-store yang menggunakan ini untuk membangun perpustakaan. Semua bekerja 100% OK, jadi saya tetap dengan ini untuk saat ini (sampai Xcode 4, mungkin)
Adam
2
Adakah yang bisa mengkonfirmasi jika metode ini bekerja untuk XCode 4.5? Saya mencoba mengkompilasi pustaka statis dan menggunakannya dalam proyek utama saya. Saya dapat menjalankan ini di perangkat tetapi tidak di simulator. Ini adalah kesalahan yang saya dapatkan: arsitektur i386 yang hilang ada di file / Pengguna / alex / Dokumen / telepon / produksi / telp / mymedia/libMyUnrar4iOS.a (2 iris)
Alex1987
2
Adakah yang tahu bagaimana membuat ini bekerja dengan XCode 5 dan ARM64? Jika saya meninggalkan arsitektur sebagai standar, itu membuat perpustakaan dengan armv7, armvs7 dan i386 seperti yang diharapkan. Jika saya menetapkan arsitektur ke standar termasuk 64bit, maka perpustakaan hanya berisi "cputype 16777223". Saya menggunakan otool -h pada file .a untuk memverifikasi apa yang ada di dalamnya
Roger Binns
1
XCode5 telah membuat menambahkan fase pembuatan skrip run bahkan lebih rumit. lihat ini: runningcriptbuildphase.com
Fabio Napodano
1
Tampaknya ini berfungsi dengan baik di Xcode 6 tanpa perubahan (hanya mencoba beberapa proyek sejauh ini, dan belum mengirimkan pembaruan App Store, tetapi sejauh ini semuanya berfungsi dengan baik).
Adam
85

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.

lipo -create libPhone.a libSimulator.a -output libUniversal.a

Saya mencobanya dan berhasil!

cahaya
sumber
4
Saya sarankan Anda membaca jawaban yang diterima. Anda mungkin menemukan bahwa ini sudah dibahas, 2 tahun sebelumnya ...
Adam
2
Saya membacanya, menggunakan skrip, tetapi tidak berfungsi untuk saya untuk armv7s.
g_low
2
perintah lipo tidak bekerja pada skrip, tetapi secara manual itu berfungsi dengan baik! 10x
Dima
9
+1 Ini benar-benar yang saya butuhkan, bukan skrip "make-a-framework" yang besar.
LearnCocos2D
Solusi AndaURL mengembalikan "Kesalahan 404 - Tidak Ditemukan"
Alex
74

Saya telah membuat templat proyek XCode 4 yang memungkinkan Anda membuat kerangka universal semudah membuat perpustakaan biasa.

Karl
sumber
Tidak dapat membangunnya dengan target iOS 4.3. Dapatkan kesalahan berikut: target penyebaran yang tidak valid untuk -stdlib = libc ++ (memerlukan iOS 5.0 atau yang lebih baru)
Alex1987
Saya berharap saya bisa memberikan lebih banyak poin reputasi untuk jawaban ini ... jauh lebih mudah daripada menggunakan CMake untuk membuat perpustakaan statis. Terima kasih banyak untuk melakukan ini!
iwasrobbed
Ini juga berfungsi dengan iOS 6 untuk saya. Tapi mungkin itu karena lib saya cukup sederhana dan tanpa ketergantungan dan sumber daya apa pun
Paulius Vindzigelskis
Ada masalah besar dengan solusi itu: orang lain yang ingin menggunakan kerangka kerja yang dibuat oleh solusi ini (solusi ini menyarankan untuk menginstal template fremework ke xcode) HARUS menginstal template ini ke xcode MEREKA !!!
evya
Anda hanya perlu menginstal templat untuk kerangka kerja nyata. Kerangka kerja palsu akan berjalan dengan baik dalam Xcode yang tidak dimodifikasi.
Karl
30

Ada utilitas baris perintah xcodebuilddan Anda dapat menjalankan perintah shell dalam xcode. Jadi, jika Anda tidak keberatan menggunakan skrip khusus, skrip ini dapat membantu Anda.

#Configurations.
#This script designed for Mac OS X command-line, so does not use Xcode build variables.
#But you can use it freely if you want.

TARGET=sns
ACTION="clean build"
FILE_NAME=libsns.a

DEVICE=iphoneos3.2
SIMULATOR=iphonesimulator3.2






#Build for all platforms/configurations.

xcodebuild -configuration Debug -target ${TARGET} -sdk ${DEVICE} ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO
xcodebuild -configuration Debug -target ${TARGET} -sdk ${SIMULATOR} ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO
xcodebuild -configuration Release -target ${TARGET} -sdk ${DEVICE} ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO
xcodebuild -configuration Release -target ${TARGET} -sdk ${SIMULATOR} ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO







#Merge all platform binaries as a fat binary for each configurations.

DEBUG_DEVICE_DIR=${SYMROOT}/Debug-iphoneos
DEBUG_SIMULATOR_DIR=${SYMROOT}/Debug-iphonesimulator
DEBUG_UNIVERSAL_DIR=${SYMROOT}/Debug-universal

RELEASE_DEVICE_DIR=${SYMROOT}/Release-iphoneos
RELEASE_SIMULATOR_DIR=${SYMROOT}/Release-iphonesimulator
RELEASE_UNIVERSAL_DIR=${SYMROOT}/Release-universal

rm -rf "${DEBUG_UNIVERSAL_DIR}"
rm -rf "${RELEASE_UNIVERSAL_DIR}"
mkdir "${DEBUG_UNIVERSAL_DIR}"
mkdir "${RELEASE_UNIVERSAL_DIR}"

lipo -create -output "${DEBUG_UNIVERSAL_DIR}/${FILE_NAME}" "${DEBUG_DEVICE_DIR}/${FILE_NAME}" "${DEBUG_SIMULATOR_DIR}/${FILE_NAME}"
lipo -create -output "${RELEASE_UNIVERSAL_DIR}/${FILE_NAME}" "${RELEASE_DEVICE_DIR}/${FILE_NAME}" "${RELEASE_SIMULATOR_DIR}/${FILE_NAME}"

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 xcodebuilddan lipo.

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.

Eonil
sumber
Terima kasih, benar-benar menarik bahwa perintah sederhana yang mendasarinya masih tampak berfungsi - hanya saja Apple memecahkan GUI mereka secara spektakuler. Sepertinya saya bisa membuat templat proyek yang sepenuhnya kustom yang akan "tidak menyedot" dan memperbaiki hal-hal yang Apple hancurkan, dengan pra-membuat semua Target, dan memasang skrip ini dengan xcode build vars. Saya akan mencobanya pada proyek saya berikutnya :)
Adam
1
Saya menggunakan skrip yang mirip dengan ini dan meletakkannya di bawah target baru yang hanya berisi skrip shell. Skrip build rekursif di atas sangat pintar, tetapi tidak perlu membingungkan.
benzado
1
Saya lebih suka skrip shell untuk hal-hal seperti ini, ini adalah take saya gist.github.com/3178578
slf
@ Benzado Ya saya sengaja menghindari kompleksitas karena saya pikir skrip shell harus mudah dibaca untuk dimodifikasi.
Eonil
lipo: tidak dapat membuka file input: / Debug-iphoneos /
Dima
11

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.

#!/bin/bash
xcodebuild -sdk iphoneos
xcodebuild -sdk iphonesimulator
lipo -create -output libJsonKit.a build/Release-iphoneos/libJsonKit.a build/Release-iphonesimulator/libJsonKit.a
Brad Robinson
sumber
7

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

SDK_VERSION=$(echo ${SDK_NAME} | grep -o '.\{3\}$')

dengan

SDK_VERSION=$(echo ${SDK_NAME} | grep -o '[\\.0-9]\{3,4\}$')
ben
sumber
Terima kasih. Saya melakukan perubahan serupa pagi ini, tetapi menggunakan \ d. Menurut saya ini yang kita inginkan (lebih baik atau lebih buruk dari milikmu?) ... grep -o '\ d \ {1,2 \} \. \ D \ {2 \} $'
Adam
Saya pikir milik saya lebih dapat diandalkan karena hanya mempertimbangkan angka
ben
1
Tidak, milik Anda cocok dengan 1 cara penulisan digit tertentu. Mengingat dukungan historis Apple untuk (dan penggunaan) karakter dan teks yang telah dicetak sebelumnya (misalnya dalam nama file), saya berharap pemilihan beberapa digit Anda menjadi kurang andal.
Adam
1
oke mungkin kamu benar. setidaknya proyek saya berhasil dan kami aman untuk 89 versi ios berikutnya
ben
solusi @ben bekerja untuk saya, regex Adam '[\\. 0-9] \ {3,4 \} $' memberikan kode kesalahan 2
Zee
4

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!

Michael Tyson
sumber
Halo Michael, saya telah mencoba template perpustakaan statis Anda tetapi saya dapat mengkompilasi untuk simulator tetapi tidak untuk perangkat, di sini kesalahan: ** BUILD GAGAL ** Perintah build berikut gagal: ProcessPCH / var / folder / qy / ncy6fkpn6677qt876ljrc54m0000gn / C / com .apple.Xcode.501 / SharedPrecompiledHeaders / MenuBarUniversal-Prefix-gwxxzpanxyudmfgryorafazokagi / MenuBarUniversal-Prefix.pch.pth MenuBarUniversal / MenuBarUniversal-Prefix.pch normalcv.cc.cob.cc.cc.cob.compile.comp.comp.cle. ) Hanya menampilkan 200 pemberitahuan pertama Perintah / bin / sh gagal dengan kode keluar 65
Kappe
2

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.

if [ -d "${CURRENTCONFIG_DEVICE_DIR}/usr/local/include" ]
then
  mkdir -p "${CURRENTCONFIG_UNIVERSAL_DIR}/usr/local/include"
  cp "${CURRENTCONFIG_DEVICE_DIR}"/usr/local/include/* "${CURRENTCONFIG_UNIVERSAL_DIR}/usr/local/include"
fi
pengguna503821
sumber
1
OK, saya telah menambahkannya ke jawaban di atas. (belum memiliki kesempatan untuk mengujinya, tetapi terlihat benar bagi saya)
Adam
1

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.

whooops
sumber