Xcode ve SDK 4+ kullanarak yağ statik kitaplığı (cihaz + simülatörü) oluşturun


283

Teorik olarak - hem simülatör hem de iPhone ve iPad'i içeren tek bir statik kütüphane oluşturabileceğimiz anlaşılıyor.

Ancak, Apple'ın bulabildiğim hiçbir belgesi yok ve Xcode'un varsayılan şablonları bunu yapacak şekilde yapılandırılmamış.

Xcode içinde yapılabilecek basit, taşınabilir, yeniden kullanılabilir bir teknik arıyorum.

Bazı tarihler:

  • 2008 yılında, hem sim hem de cihazı içeren tek statik-libs yapabilirdik. Apple bunu devre dışı bıraktı.
  • 2009 yılı boyunca, biri sim, diğeri cihaz için olmak üzere statik çiftler yaptık. Apple şimdi bunu devre dışı bıraktı.

Referanslar:

  1. Bu harika bir fikir, mükemmel bir yaklaşım ama işe yaramıyor: http://www.drobnik.com/touch/2010/04/universal-static-libraries/

    • Senaryosunda sadece makinede çalıştığı anlamına gelen bazı hatalar var - onları "tahmin etmek" yerine BUILT_PRODUCTS_DIR ve / veya BUILD_DIR kullanıyor olmalı)
    • Apple'ın en son Xcode'u yaptığı şeyi yapmanızı engeller - Xcode'un hedefleri işleme şeklindeki (Belgelenmiş) değişiklik nedeniyle çalışmaz.
  2. Başka bir SO sorgusu, xcode OLMADAN ve arm6 vs arm7 kısmına odaklanan yanıtlarla nasıl yapılacağını sordu - ancak i386 bölümünü yok saydı: Armv6, armv7 ve i386 için statik bir kitaplığı (yağ) nasıl derleyebilirim?

    • Apple'ın en son değişikliklerinden beri, Simülatör kısmı artık arm6 / arm7 farkı ile aynı değil - farklı bir sorun, yukarıya bakın)

Sadece merak ediyorum - neden bunu istesin? Cihaz kitaplığını cihazda daha büyük ve daha ağır yapmıyor mu?
cregox

3
@Cawas - kütüphanenin "ağırlığı", gerçek dünyadaki durumların% 95'inde önemsizdir - çoğumuz için, özellikle küçük olanlar, örneğin yalnızca tek bir UIImageView görüntülemeye kıyasla, küçüktür.
Adam

1
@Cawas - bu arada, buradaki değer, diğer kişilerin kitaplığınızı kullanmasını / yeniden kullanmasını ÇOK daha kolay hale getirmenizdir. Tek aşamalı bir sürükle / bırak işlemi haline gelir.
Adam

4
@Cawas - son olarak, şaşırtıcı derecede değerli bir fayda: yanlışlıkla birine "yanlış" derlenmiş kitaplığı göndermek çok kolaydır - XCode sıfır kontroller yapar ve "yanlış" mimariyi "doğru" olduğunu düşündüğünüz adlandırılmış dosyaya mutlu bir şekilde derler mimari. Apple bu alanda Xcode'u kırmaya devam ediyor - her yeni sürümde "lib'inizi doğru şekilde derlemek için dün bastığınız düğme bugün yanlış derlenecek" anlamına gelen değişiklikler var. Apple bizi her yere karıştırmayı bırakana kadar, kötü kullanıcı arayüzlerini aptalca kanıtlamalıyız :).
Adam

1
Gerçekten harika olurdu! Çünkü şu an olduğu gibi, biraz daha karmaşık bir şey için simülatöre güvenemeyiz.
cregox

Yanıtlar:


272

ALTERNATİFLERİ:

En son sürümün kolay kopyalanması / yapıştırılması (ancak yükleme talimatları değişebilir - aşağıya bakın!)

Karl'ın kütüphanesi kurulum için daha fazla çaba harcar, ancak çok daha güzel uzun vadeli bir çözüm (kütüphanenizi bir Çerçeveye dönüştürür).

Bunu kullanın, sonra Arşiv yapıları için destek eklemek için ince ayar yapın - cf @ Frederik'in aşağıdaki Arşiv modu ile güzel çalışması için kullandığı değişikliklerle ilgili yorumu.


SON DEĞİŞİKLİKLER: 1. iOS 10.x için destek eklendi (eski platformlar için destek korunurken)

  1. Bu komut dosyasını başka bir projeye katıştırılmış bir projeyle nasıl kullanacağınız hakkında bilgi (bunu yapmamanızı şiddetle tavsiye ederim. 3.x - Xcode 4.6.x arası)

  2. Paketleri otomatik olarak eklemenize izin veren bonus komut dosyası (örn. Kütüphanenizden PNG dosyaları, PLIST dosyaları vb. Dahil edin!) - aşağıya bakın (aşağıya kaydırın)

  3. artık iPhone5'i destekliyor (Apple'ın lipo'daki hatalara geçici çözümünü kullanarak). NOT: yükleme talimatları değişti (muhtemelen betiği gelecekte değiştirerek basitleştirebilirim, ancak şimdi risk almak istemiyorum)

  4. "kopya başlıkları" bölümü artık genel başlıkların konumu için oluşturma ayarına saygı duyuyor (Frederik Wallner'ın izniyle)

  5. Doug Dickinson sayesinde SYMROOT'un açık ayarı eklendi (belki de OBJROOT'un da ayarlanması gerekir?)


SCRIPT (kopyalamanız / yapıştırmanız gereken şey budur)

Kullanım / kurulum talimatları için aşağıya bakın

##########################################
#
# 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

TALİMATLARI YÜKLE

  1. Statik bir lib projesi oluşturma
  2. Hedefi Seçin
  3. "Derleme Ayarları" sekmesinde, "Yalnızca Etkin Mimari Oluştur" u "HAYIR" olarak ayarlayın ( tüm öğeler için)
  4. "Derleme Aşamaları" sekmesinde, "Ekle ... Yeni Derleme Aşaması ... Yeni Komut Dosyası Oluşturma Safhası Çalıştır" ı seçin
  5. Komut dosyasını (yukarıda) kopyalayın / kutuya yapıştırın

... BONUS OPSİYONEL kullanımı:

  1. İSTEĞE BAĞLI: kitaplığınızda başlıklar varsa, bunları "Başlıkları Kopyala" aşamasına ekleyin
  2. İSTEĞE BAĞLI: ... ve "Proje" bölümünden "Genel" bölümüne sürükleyip bırakın
  3. İSTEĞE BAĞLI: ... ve uygulamayı her oluşturduğunuzda "hata ayıklama evrensel" dizininin bir alt dizinine OTOMATİK olarak dışa aktarılırlar (usr / local / include dizininde olacaklar)
  4. İSTEĞE BAĞLI: NOT: ayrıca projenizi başka bir Xcode projesine sürükleyip bırakmaya çalışırsanız, Xcode 4'te sürükleyip bırakılan projenizde Genel Üstbilgiler varsa bir .IPA dosyası oluşturamayacak bir hata ortaya çıkar. Çözüm: xcode projelerini yerleştirmeyin (Apple kodunda çok fazla hata var!)

Çıktı dosyasını bulamıyorsanız, işte size bir geçici çözüm:

  1. Komut dosyasının sonuna aşağıdaki kodu ekleyin (Frederik Wallner'ın izniyle): "$ {CREATING_UNIVERSAL_DIR}"

  2. Apple 200 satırdan sonra tüm çıktıları siler. Hedefinizi seçin ve Komut Dosyası Çalıştırma Aşamasında, "Oluşturma günlüğünde ortam değişkenlerini göster"

  3. XCode4 için özel bir "derleme çıktısı" dizini kullanıyorsanız, XCode tüm "beklenmeyen" dosyalarınızı yanlış yere koyar.

    1. Projeyi derleyin
    2. Xcode4'un sol üst kısmındaki sağdaki son simgeye tıklayın.
    3. En üstteki öğeyi seçin (bu "en son derlemeniz" dir. Apple bunu otomatik olarak seçmelidir, ancak bunu düşünmediler)
    4. ana pencerede aşağıya kaydırın. En son satır şunu okumalıdır: lipo: geçerli yapılandırma (Hata Ayıklama) için çıktı dosyası oluşturma: /Users/blah/Library/Developer/Xcode/DerivedData/AppName-ashwnbutvodmoleijzlncudsekyf/Build/Products/Debug-universal/libTargetName.a

    ... Universal Build'ınızın yeri budur.


Projenize "kaynak kodu olmayan" dosyalar nasıl eklenir (PNG, PLIST, XML, vb.)

  1. Yukarıdaki her şeyi yapın, çalışıp çalışmadığını kontrol edin
  2. İLK BİRİNDEN SONRA yeni bir Komut Dosyası Çalıştır aşaması oluşturun (aşağıdaki kodu kopyalayın / yapıştırın)
  3. Xcode içinde "paket" türünde yeni bir Hedef oluşturun
  4. ANA PROJENİZDE, "Yapılandırma Aşamaları" nda, yeni paketi "bağlı" bir şey olarak ekleyin (üst bölüm, artı düğmesine basın, aşağı kaydırın, Ürünlerinizdeki ".bundle" dosyasını bulun)
  5. YENİ BUNDLE HEDEFİNİZE, "Derleme Aşamaları" alanına, "Paket Kaynaklarını Kopyala" bölümü ekleyin ve tüm PNG dosyalarını vb. İçine sürükleyip bırakın.

Oluşturulan paketleri otomatik olarak FAT statik kitaplığınızla aynı klasöre kopyalayan komut dosyası:

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}"

2
Bunu birkaç projede kullandım ve bunu kütüphaneleri oluşturmak için kullanılan uygulama mağazasına gönderdim. Hepsi% 100 iyi çalıştı, bu yüzden şimdilik bununla yapıyorum (belki Xcode 4'e kadar)
Adam

2
Herkes bu yöntemin XCode 4.5 için çalışıp çalışmadığını doğrulayabilir mi? Statik bir kitaplık derlemeye ve ana projemde kullanmaya çalışıyorum. Bunu cihazda çalıştırabiliyorum, ancak simülatörde çalışamıyorum. Bu hata alıyorum: /Users/alex/Documents/iphone/production/iphone/mymedia/libMyUnrar4iOS.a (2 dilim) dosyasında gerekli mimari i386 eksik
Alex1987 17:12

2
Bunun XCode 5 ve ARM64 ile nasıl çalışacağına dair bir fikrin var mı? Mimarileri standart olarak bırakırsam, armv7, armvs7 ve i386 ile kütüphaneyi beklendiği gibi yapar. Mimarileri 64 bit dahil standart olarak ayarlarsam, kütüphane yalnızca "cputype 16777223" içerir. İçinde ne olduğunu doğrulamak için .a dosyasında otool -h kullanırım
Roger Binns

1
XCode5 bir çalışma komut dosyası oluşturma aşaması eklemeyi daha da zorlaştırdı. Bunu kontrol et: runscriptbuildphase.com
Fabio Napodano

1
Bu, Xcode 6'da değişiklik yapılmadan iyi çalışıyor gibi görünüyor (şimdiye kadar sadece birkaç projeyi denedi ve henüz App Store güncellemesi göndermedi, ancak şu ana kadar hepsi iyi çalışıyor).
Adam

85

Armv7, armv7s ve simülatör üzerinde çalışacak yağ statik bir kütüphane oluşturmaya çalışmak için uzun saatler geçirdim. Sonunda bir çözüm buldum .

Amaç iki kütüphaneyi (biri cihaz için, sonra simülatör için) ayrı ayrı oluşturmak, birbirinden ayırmak için yeniden adlandırmak ve daha sonra bunları bir kütüphaneye lipo-yaratmaktır.

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

Denedim ve işe yarıyor!


4
Kabul edilen cevabı okumanızı tavsiye ederim. Bunun 2 yıl önce ele alındığını görebilirsiniz ...
Adam

2
Okudum, senaryoyu kullandım, ama armv7'ler için benim için çalışmıyor.
g_low

2
lipo komutu komut dosyasında çalışmaz, ancak elle harika çalışır! 10x
Dima

9
+1 Bu gerçekten ihtiyacım olan tek şeydi, büyük bir "çerçeve oluştur" senaryosu değil.
LearnCocos2D

SolutionURL dönüşünüz "Hata 404 - Bulunamadı"
Alex

74

Düzenli bir kütüphane yapmak kadar evrensel bir çerçeve oluşturmanıza izin veren bir XCode 4 proje şablonu hazırladım .


İOS 4.3 hedefi ile oluşturulamadı. Aşağıdaki hatayı alın: -stdlib = libc ++ için geçersiz dağıtım hedefi (iOS 5.0 veya
üst sürümünü

Keşke bu cevap için daha fazla itibar puanı verebilseydim ... statik bir kütüphane oluşturmak için CMake'i kullanmaktan çok daha kolay. Bunu yaptığınız için çok teşekkür ederim!
iwasrobbed

Benim için iOS 6 ile de çalışır. Ama belki de benim
lib'm

Bu çözümle ilgili BÜYÜK bir sorun var: bu çözüm tarafından oluşturulan çerçeveyi kullanmak isteyen diğer kişiler (bu çözüm xcode için fremework şablonunu yüklemenizi önerir) bu şablonu THEIR xcode'a KURMALIDIR !!!
evya

Şablonu yalnızca gerçek çerçeveler için yüklemeniz gerekir. Sahte çerçeveler değiştirilmemiş Xcode ile sorunsuz çalışır.
Karl

30

Bir komut satırı yardımcı programı vardır xcodebuildve xcode içinde shell komutunu çalıştırabilirsiniz. Bu nedenle, özel komut dosyası kullanmayı düşünmezseniz, bu komut dosyası size yardımcı olabilir.

#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}"

Belki verimsiz görünüyor (kabuk senaryosunda iyi değilim), ama anlaşılması kolay. Yalnızca bu komut dosyasını çalıştıran yeni bir hedef yapılandırdım. Komut dosyası komut satırı için tasarlanmıştır ancak test edilmez :)

Temel kavram xcodebuildve lipo.

Xcode UI içinde birçok yapılandırmayı denedim, ancak hiçbir şey işe yaramadı. Bu bir tür toplu işlem olduğundan, komut satırı tasarımı daha uygundur, bu yüzden Apple yavaş yavaş Xcode'dan toplu oluşturma özelliğini kaldırdı. Bu yüzden gelecekte UI tabanlı yığın oluşturma özelliği sunmayı beklemiyorum.


Teşekkürler, temeldeki basit komutların hala çalışıyor gibi görünmesi gerçekten ilginç - sadece Apple GUI'larını muhteşem bir şekilde kırdı. Görünüşe göre, tüm Hedefleri önceden yaparak ve bu komut dosyasını xcode build vars ile kablolayarak Apple'ın kırdığı şeyleri düzeltemeyecek ve düzeltemeyecek tamamen özel bir proje şablonu yapabilirdim. Bir sonraki
Adam

1
Buna benzer bir komut dosyası kullandım ve yalnızca kabuk komut dosyasını içeren yeni bir hedefin altına koydum. Yukarıdaki özyinelemeli komut dosyası çok zekidir, ancak gereksiz yere kafa karıştırıcıdır.
benzado

1
Bunun gibi şeyler için kabuk komut dosyalarını tercih ederim, işte benim almak gist.github.com/3178578
slf

@benzado Evet bilerek karmaşıklığı önledim çünkü kabuk betiğinin değiştirilmesi için okunması kolay olmalı diye düşünüyorum.
Eonil

lipo: giriş dosyası açılamıyor: / Debug-iphoneos /
Dima

11

JsonKit için yağ statik bir lib gerekli yani Xcode statik bir lib projesi oluşturulan ve sonra bu bash komut dosyası proje dizininde koştu. Xcode projesini "Yalnızca etkin yapılandırma oluştur" kapalı olarak yapılandırdığınız sürece, tüm mimarileri tek bir lib'de almalısınız.

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

7

IOS 10 Güncellemesi:

Ben iphoneos10.0 ile fatlib bina ile ilgili bir sorun vardı çünkü komut dosyasında düzenli ifade sadece 9.x ve daha düşük bekliyor ve ios 10.0 için 0.0 döndürür

Bunu düzeltmek için sadece değiştirin

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

ile

SDK_VERSION=$(echo ${SDK_NAME} | grep -o '[\\.0-9]\{3,4\}$')

Teşekkürler. Ben bu sabah benzer bir değişiklik yaptım, ama \ d. Bu istediğim olduğunu düşünüyorum (sizinkinden daha iyi veya daha kötü mü?) ... grep -o '\ d \ {1,2 \} \. \ D \ {2 \} $'
Adam

Sadece sayıları dikkate beri mayın daha güvenilir olduğunu düşünüyorum
Ben'i

1
Hayır, sizinki rakam yazmanın 1 belirli yöntemiyle eşleşir. Apple'ın önceden hazırlanmış karakterler ve metin (örneğin dosya adlarında) için tarihsel desteği göz önüne alındığında, birkaç basamaklı tescilli seçiminizin daha az güvenilir olmasını beklerdim.
Adam

1
tamam belki de haklısın. en azından benim projemi de çalıştırdı ve sonraki 89 ios sürümü için güvenliyiz
ben

@ben çözümü benim için çalışıyor, Adam'ın düzenli ifadesi '[\\. 0-9] \ {3,4 \} $' 2 hata kodunu veriyor
Zee

4

Bunu Xcode 4 şablonuna , Karl'ın statik çerçeve şablonuyla aynı şekilde yaptım .

Statik çerçeveler oluşturmanın (düz statik kütüphaneler yerine), görünür bir linker hatası nedeniyle LLVM ile rastgele çökmelere neden olduğunu buldum - bu yüzden statik kütüphanelerin hala yararlı olduğunu düşünüyorum!


Merhaba Michael, statik kütüphane şablonunu denedim ama simülatör için derleyebilirim, ancak cihaz için değil, burada hata: ** YAPILANDIRILDI ** Aşağıdaki oluşturma komutları başarısız oldu: ProcessPCH / var / folders / qy / ncy6fkpn6677qt876ljrc54m0000gn / C / com .apple. ) Yalnızca ilk 200 bildiri gösteriliyor Komut / bin / sh çıkış kodu 65 ile başarısız oldu
Kappe

2

İyi iş! Benzer bir şeyi birlikte hackledim, ancak ayrı olarak çalıştırmak zorunda kaldım. Sadece oluşturma sürecinin bir parçası olması onu çok daha basit hale getirir.

Bir not notu. Herkese açık olarak işaretlediğiniz dahil etme dosyalarının hiçbirinin kopyalanmadığını fark ettim. Senaryomda sahip olduğum şeyi kendinize uyarladım ve oldukça iyi çalışıyor. Aşağıdakileri komut dosyanızın sonuna yapıştırın.

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

1
Tamam, yukarıdaki cevaba ekledim. (henüz test etme şansım olmadı, ama bana doğru görünüyor)
Adam

1

Aslında bu amaçla kendi senaryomu yazdım . Xcode kullanmaz. (Gambit Scheme projesinde benzer bir senaryoya dayanmaktadır.)

Temel olarak, ./configure komutunu çalıştırır ve üç kez (i386, armv7 ve armv7'ler için) yapar ve ortaya çıkan kitaplıkların her birini bir yağ kütüphanesinde birleştirir.

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.