SORU
19 AĞUSTOS 2010, PERŞEMBE


Şişman statik kütüphane (aygıt simülatörü) böyle büyük mükafat ve SDK 4 kullanılarak inşa

- Teorik olarak - her iki simülatör ve iPhone ve iPad içeren tek bir statik bir kütüphane inşa edebiliriz gibi görünüyor.

Ancak, Apple bulabilirim bu konuda hiçbir belge yok, ve böyle büyük mükafat varsayılan şablonları bunu yapmak için yapılandırılmamış.

Böyle büyük mükafat içinde yapılabilecek basit, taşınabilir, yeniden kullanılabilir bir yöntem arıyorum.

Bazı tarih:

  • 2008, tek bir statik-libs yapabilmek için kullandık hem sim ve cihaz dahil. Apple bu devre dışı.
  • 2009, statik libs çift - sım için yaptık boyunca, aygıt için bir tane. Apple şimdi de devre dışı bıraktı.

Referanslar:

  1. Bu harika bir fikir olduğunu, it's an excellent approach ama işe yaramıyor.

    • Onun sadece makine çalışır anlamına gelir bu senaryoyu bazı hatalar - BUİLT_PRODUCTS_DİR kullanan ve/veya yerine "G'nin hesabına göre .. .." onları . BUİLD_DİR olmalı var
    • Apple'ın son Güncellemelerinden ne yaptığı - sadece işe yaramaz, böyle büyük mükafat süreçleri hedefleri nasıl (Belgelenmiş) değişikliği nedeniyle) yapıyor engeller
  2. Başka bir 5* *ve vs armv6 armv7 kısmı odaklanmış ama i386 kısmı göz ardı yanıtlar.

    • Apple'ın en son değişiklikleri bu yana, Simülatör bölümü armv6/armv7 farkı daha farklı bir sorun var, yukarıda) aynı şey değil

CEVAP
5 EYLÜL 2010, Pazar


ALTERNATİFLER:

Easy copy/paste of latest version (ama yükleme talimatları değiştirmek olabilir - aşağıya bakın!)

Karl's library çok daha fazla çaba Kur, ama çok daha güzel ve uzun vadeli bir çözüm (bir Çerçeve içine kütüphane dönüştürür) alır.


SON DEĞİŞİKLİKLER:

  1. Bilgi nasıl kullanılır Bu komut ile bir proje-gömülü-içinde-bir-proje (her ne kadar ben çok tavsiye DEĞİL, bunu yaparken hiç Elma var bir çift olarak dikkat çeken hatalar böyle büyük mükafat eğer embed projeleri içinde birbirlerine, " Güncellemelerinden 3.4.6 böyle büyük mükafat için x.x)

  2. Eğer otomatik vardır izin Bonus script Demetleri (yani kütüphane dosyaları, PLİST dosyaları, vb PNG dahil!) - aşağıda () kaydırma için aşağıya bakınız

  3. şimdi iPhone5 destekler (lipo böcekler için Apple'ın geçici çözümü kullanarak). NOT: yükleme talimatları değişti (muhtemelen gelecekte senaryoyu değiştirerek bunu kolaylaştırmak istiyorum. şimdi risk almak istemiyorum)

  4. < . p ^"kopyala başlıklar" bölümü artık saygı kamu yerleri için inşa ayar başlıklar (Frederik Wallner izniyle)

  5. SYMROOT ekledi açık ayarı (belki OBJROOT gereken çok ayarlanacak?), Doug Dickinson için teşekkürler


SCRİPT (bu kopyala/yapıştır sana ne)

Kullanım için talimatlar yükle, aşağıya bakın

##########################################
#
# c.f. http://stackoverflow.com/questions/3520977/build-fat-static-library-device-simulator-using-xcode-and-sdk-4
#
# Version 2.7
#
# Latest Change:
# - Supports iPhone 5 / iPod Touch 5 (uses Apple's workaround to lipo bug)
# 
# 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 '.\{3\}$')

# 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ÜKLEYİN

  1. Statik lib bir proje oluşturun
  2. Hedef seçin
  3. "Ayarlar", "Aktif Mimarlık Sadece İnşa" için "" (için . herhangi bir sekme set İnşa ^em>tümöğeleri)
  4. "Aşama", "Faz İnşa ... ... Yeni Çalışma Yeni Senaryo Aşaması Kurmak Ekle" . seçin sekmesi Oluşturma
  5. Kopyala/script (yukarıda) kutusuna yapıştırın

...BONUS İSTEĞE bağlı kullanımı:

5=başlangıç
  • İSTEĞE bağlı: eğer kütüphanede başlıkları varsa, bunları eklemek için "Başlıklar" faz . Kopya
  • İSTEĞE bağlı: ...ve sürükle "" "" bölüm . Halka bölümde projeden bırakın/
  • İSTEĞE bağlı: ...ve bunlar OTOMATİK olarak ihraç edilecek her yapı uygulaması, bir alt-dizin "debug-evrensel" dizini (onlar usr/local/include)
  • İSTEĞE bağlı: NOT: Eğerayrıca/Güncellemelerinden başka bir proje halinde proje bırak sürüklemek için deneyin, bu bir bağlantı oluşturmak 4, " Güncellemelerinden bir hata gösterir .Eğer sürükleyin Kamu Başlıklar varsa IPA dosya/proje düştü. Çözüm:' embed Güncellemelerinden projeleri (Apple kodunda çok fazla hata!) dont

    Eğer çıktı dosyası bulabilirseniz, burada bir çözüm var:

    1. Yazısının sonuna (Frederik Wallner nezaket) için aşağıdaki kodu ekleyin: "${CREATİNG_UNİVERSAL_DİR}" . aç

    2. Apple 200 satır sonra tüm çıkış siler. Hedefinizi seçin ve Çalıştır Komut Aşamasında, işaretini kaldırın GEREKİR: oluşturma günlüğüne Göster "ortam değişkenleri"

    3. eğer "çıkış yap" XCode4, o zaman böyle büyük mükafat sokuyor için dizin "" yanlış yerde. dosyaları beklenmeyen bir özel kullanıyorsanız

      1. Projeyi derleyin
      2. Xcode4 sol üst bölgesinde sağ tarafta son simgesi, üzerine tıklayın.
      3. Üst öğeyi (bu, "en son oluştur" seçeneğini seçin. Apple otomatik seç, ama şunu bir düşünün etmediler)
      4. ana pencerede, altına gidin. En çok son satırı şöyle olmalıdır: lipo için geçerli yapılandırma (hata Ayıklama) oluşturma çıktı dosyası: /Users/blah/Library/Developer/Xcode/DerivedData/AppName-ashwnbutvodmoleijzlncudsekyf/Build/Products/Debug-universal/libTargetName.bir

      ...bu Evrensel konumunu Kurmak.


    Nasıl "" proje dosyaları (PNG, PLİST, XML, vb.) olmayan kaynak kod eklemek

    1. Her şeyden önce bir incele
    2. Yeni bir Çalışma ilki (kopyala/aşağıdaki kodu yapıştırın) SONRA gelen Komut faz oluşturmak
    3. Güncellemelerinden yeni bir Hedef, bir tür oluşturmak"" . bundle
    4. ANA PROJE, "Aşama", bir şey olarak yeni paket Ekle "bağlı" (üst kısım, artı düğmesini, altına gidin vurmak, bulmak ".İnşa bundle" Ürün dosyası)
    5. YENİ PAKET HEDEFİN, "Aşama", ekleme bir "Paket Kaynakları" bölümü ve sürükle/bırak tüm PNG dosyaları içine vb . Kopya Oluştur

    Otomatik kopyalama ŞİŞMAN statik kütüphane olarak inşa edilmiş paket(ler) aynı klasör içine komut:

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

  • Bunu Paylaş:
    • Google+
    • E-Posta
    Etiketler:

    YORUMLAR

    SPONSOR VİDEO

    Rastgele Yazarlar

    • HER0R

      HER0R

      16 Aralık 2007
    • Lena Danya

      Lena Danya

      11 NİSAN 2010
    • TV nEW

      TV nEW

      25 AĞUSTOS 2012