Xcode और SDK 4+ का उपयोग करके फैट स्टैटिक लाइब्रेरी (डिवाइस + सिम्युलेटर) बनाएँ


283

ऐसा प्रतीत होता है कि हम सैद्धांतिक रूप से - एक एकल स्थिर पुस्तकालय का निर्माण कर सकते हैं जिसमें सिम्युलेटर और iPhone और iPad दोनों शामिल हैं।

हालाँकि, Apple के पास इस पर कोई प्रलेखन नहीं है जो मुझे मिल सकता है, और Xcode के डिफ़ॉल्ट टेम्प्लेट को ऐसा करने के लिए कॉन्फ़िगर नहीं किया गया है।

मैं एक सरल, पोर्टेबल, पुनः प्रयोग करने योग्य तकनीक की तलाश कर रहा हूं जिसे Xcode के अंदर किया जा सकता है।

कुछ इतिहास:

  • 2008 में, हम सिंगल स्टैटिक-लिबास बनाने में सक्षम थे, जिसमें सिम और डिवाइस दोनों शामिल थे। Apple ने उसे अक्षम कर दिया।
  • 2009 के दौरान, हमने स्थिर लिबास के जोड़े बनाए - एक सिम के लिए, एक डिवाइस के लिए। Apple ने अब इसे भी अक्षम कर दिया है।

संदर्भ:

  1. यह एक महान विचार है, यह एक उत्कृष्ट दृष्टिकोण है, लेकिन यह काम नहीं करता है: http://www.drobnik.com/touch/2010/04/universal-static-lbooks/

    • उनकी लिपि में कुछ कीड़े हैं, जिसका अर्थ है कि यह केवल उनकी मशीन पर काम करता है - उन्हें BUILT_PRODUCT_DIR और / या BUILD_DIR के बजाय "guesstimating" का उपयोग करना चाहिए)
    • Apple का नवीनतम Xcode आपको वह करने से रोकता है जो उसने किया है - यह केवल काम नहीं करेगा (डॉक्यूमेंटेड) यह बताता है कि XX प्रक्रिया कैसे करता है)
  2. एक अन्य एसओ प्रश्नकर्ता ने पूछा कि यह बिना एक्सकोड के कैसे किया जा सकता है, और आर्म 6 बनाम आर्म 7 भाग पर ध्यान केंद्रित करने वाली प्रतिक्रियाओं के साथ - लेकिन i386 भाग को नजरअंदाज कर दिया: मैं आर्मव्यू, आर्मवि 7 और आई 386 के लिए एक स्थिर पुस्तकालय (वसा) कैसे संकलित करता हूं

    • Apple के नवीनतम परिवर्तनों के बाद से, सिम्युलेटर भाग arm6 / arm7 अंतर के समान नहीं है - यह एक अलग समस्या है, ऊपर देखें)

बस सोच रहा था - तुम ऐसा क्यों चाहोगी? क्या यह डिवाइस पर डिवाइस लाइब्रेरी को बड़ा और भारी नहीं बनाता है?
cregox

3
@ कैवास - पुस्तकालय का "वजन" वास्तविक दुनिया की 95% स्थितियों में अप्रासंगिक है - हम में से अधिकांश के लिए, लिबास छोटे हैं, विशेष रूप से उदाहरण के लिए, केवल एक एकल UIImageView प्रदर्शित करने की तुलना में।
एडम

1
@ कावा - इस बीच, यहाँ मूल्य यह है कि आप अपने पुस्तकालय का उपयोग / पुनः उपयोग करने के लिए अन्य लोगों के लिए इसे बहुत आसान बना देते हैं। यह वन-स्टेज ड्रैग / ड्रॉप प्रोसेस बन जाता है।
एडम

4
@ कावा - अंत में, एक आश्चर्यजनक रूप से मूल्यवान लाभ: गलती से किसी को "गलत" संकलित पुस्तकालय भेजना आसान है - XCode शून्य जांच करता है, और खुशी से "गलत" वास्तुकला को नामित फ़ाइल में संकलित करेगा जिसे आपने "सही" माना था। आर्किटेक्चर। Apple इस क्षेत्र में एक्सकोड को तोड़ता रहता है - प्रत्येक नए संस्करण में परिवर्तन होता है, जिसका अर्थ है "कल आपने जो बटन दबाया था, वह आपके काम को सही ढंग से संकलित करने के लिए आज गलत तरीके से संकलित करेगा"। जब तक Apple हमारे चारों ओर गड़बड़ करना बंद नहीं कर देती, तब तक हमें उनके बुरे UI :) को बेवकूफ़ बनाना चाहिए।
एडम

1
यह वास्तव में बहुत अच्छा होगा! क्योंकि अभी के रूप में यह है, हम बस कुछ और अधिक जटिल के लिए सिम्युलेटर पर भरोसा नहीं कर सकते।
क्रेगॉक्स

जवाबों:


272

विकल्प:

नवीनतम संस्करण की आसान कॉपी / पेस्ट (लेकिन इंस्टॉलेशन निर्देश बदल सकते हैं - नीचे देखें!)

कार्ल की लाइब्रेरी सेटअप के लिए और अधिक प्रयास करती है, लेकिन बहुत अच्छे दीर्घकालिक समाधान (यह आपकी लाइब्रेरी को एक फ्रेमवर्क में परिवर्तित करता है)।

इसका उपयोग करें, फिर इसे आर्काइव बिल्ड के लिए समर्थन जोड़ने के लिए ट्वीक करें - cf @ Frederik की टिप्पणी नीचे उन परिवर्तनों पर है जो इस काम को पुरालेख मोड के साथ अच्छी तरह से बनाने के लिए उपयोग कर रहे हैं।


हाल के परिवर्तन: 1. आईओएस 10.x के लिए समर्थन जोड़ा गया (पुराने प्लेटफार्मों के लिए समर्थन बनाए रखते हुए)

  1. प्रोजेक्ट-एंबेड-इन-अदर-प्रोजेक्ट के साथ इस स्क्रिप्ट का उपयोग करने के तरीके के बारे में जानकारी (हालांकि मैं अत्यधिक ऐसा नहीं करने की सलाह देता हूं, कभी भी - Apple के पास Xcode में कुछ शो-स्टॉपर बग हैं, यदि आप एक दूसरे के अंदर प्रोजेक्ट्स को Xcode से एम्बेड करते हैं। 3.x के माध्यम से Xcode 4.6.x)

  2. बोनस स्क्रिप्ट आपको ऑटो-बंडलों को शामिल करने की अनुमति देता है (यानी आपकी लाइब्रेरी से PNG फ़ाइलें, PLIST फ़ाइलें आदि शामिल हैं!) - नीचे देखें (नीचे से स्क्रॉल करें)

  3. अब iPhone5 का समर्थन करता है (लिपो में कीड़े के लिए Apple के वर्कअराउंड का उपयोग करके)। नोट: इंस्टॉल निर्देश बदल गए हैं (मैं भविष्य में स्क्रिप्ट को बदलकर इसे सरल बना सकता हूं, लेकिन अब इसे जोखिम में नहीं डालना चाहता)

  4. "कॉपी हेडर" अनुभाग अब सार्वजनिक हेडर के स्थान के लिए बिल्ड सेटिंग का सम्मान करता है (फ्रेडरिक वालनर के सौजन्य से)

  5. डॉग डिकिन्सन के लिए धन्यवाद, SYMROOT की स्पष्ट स्थापना (शायद OBJROOT को भी सेट करने की आवश्यकता है?)


SCRIPT (यह आपको कॉपी / पेस्ट करना है)

निर्देशों का उपयोग / स्थापित करने के लिए, नीचे देखें

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

सबसे पहले निर्देश

  1. एक स्टेटिक लिबिड प्रोजेक्ट बनाएं
  2. लक्ष्य का चयन करें
  3. "बिल्ड सेटिंग्स" टैब में, "नो एक्टिव" केवल "नो आर्किटेक्चर बनाएँ" ( सभी मदों के लिए) सेट करें
  4. "बिल्ड चरण" टैब में, "जोड़ें ... नया बिल्ड चरण ... नया रन स्क्रिप्ट बिल्ड चरण" चुनें
  5. बॉक्स में स्क्रिप्ट (ऊपर) कॉपी / पेस्ट करें

... बोनस वैकल्पिक उपयोग:

  1. वैकल्पिक: यदि आपके पुस्तकालय में हेडर हैं, तो उन्हें "कॉपी हेडर्स" चरण में जोड़ें
  2. वैकल्पिक: ... और उन्हें "प्रोजेक्ट" सेक्शन से "पब्लिक" सेक्शन में ड्रैग / ड्रॉप करें
  3. वैकल्पिक: ... और वे स्वचालित रूप से "डिबग-यूनिवर्सल" डायरेक्टरी की उप-निर्देशिका में एप्लिकेशन बनाने के दौरान हर बार निर्यात करेंगे (वे usr / स्थानीय / शामिल होंगे)
  4. वैकल्पिक: नोट: यदि आप भी अपनी परियोजना को किसी अन्य Xcode परियोजना में खींचने / छोड़ने का प्रयास करते हैं, तो यह Xcode 4 में एक बग को उजागर करता है, जहां यह आपके .pA फ़ाइल को आपके ड्रैग / ड्रॉप प्रोजेक्ट में सार्वजनिक हेडर नहीं बना सकता है। वर्कअराउंड: न 'एक्सकोड प्रोजेक्ट्स को एम्बेड करें (Apple के कोड में बहुत से बग्स!)

यदि आपको आउटपुट फ़ाइल नहीं मिल रही है, तो यहां एक समाधान है:

  1. स्क्रिप्ट के बहुत अंत में निम्नलिखित कोड जोड़ें (फ्रेडरिक वाल्नर के सौजन्य से): "$ {CREATING_UNIVERSAL_DIR} खोलें"

  2. Apple 200 लाइनों के बाद सभी आउटपुट को हटा देता है। अपने लक्ष्य का चयन करें, और रन स्क्रिप्ट चरण में, आप अनचाहे क्लिक करें: "बिल्ड लॉग में पर्यावरण चर दिखाएं"

  3. यदि आप XCode4 के लिए एक कस्टम "बिल्ड आउटपुट" निर्देशिका का उपयोग कर रहे हैं, तो XCode आपकी सभी "अनपेक्षित" फ़ाइलों को गलत स्थान पर रखता है।

    1. प्रोजेक्ट बनाएं
    2. Xcode4 के ऊपरी बाएँ क्षेत्र में दाईं ओर अंतिम आइकन पर क्लिक करें।
    3. शीर्ष आइटम का चयन करें (यह आपका "सबसे हाल का निर्माण" है। Apple को इसे ऑटो-सेलेक्ट करना चाहिए, लेकिन उन्होंने ऐसा नहीं सोचा था)
    4. मुख्य विंडो में, नीचे स्क्रॉल करें। बहुत अंतिम पंक्ति को पढ़ना चाहिए: लाइपो: वर्तमान कॉन्फ़िगरेशन (डिबग) के लिए आउटपुट फ़ाइल बनाने में: /Users/blah/Library/Developer/Xcode/DerivedData/AppName-ashwnbutvodmijzlncndscudsekyf/Build/Products/Debug-universal/ibivers/ib/

    ... यह आपके यूनिवर्सल बिल्ड का स्थान है।


अपनी परियोजना में "नॉन सोर्सकोड" फाइलें कैसे शामिल करें (PNG, PLIST, XML, आदि)

  1. उपरोक्त सब कुछ करें, यह जांचें
  2. एक नया रन स्क्रिप्ट चरण बनाएं जो पहले एक के बाद आता है (नीचे दिए गए कोड को कॉपी / पेस्ट करें)
  3. "बंडल" प्रकार का, Xcode में एक नया लक्ष्य बनाएं
  4. अपने मुख्य कार्यक्रम में, "चरणों का निर्माण करें" में, नया बंडल जोड़ें जैसा कि यह "कुछ इस पर निर्भर करता है" (शीर्ष अनुभाग, प्लस बटन दबाएं, नीचे स्क्रॉल करें, अपने उत्पादों में ".bundle" फ़ाइल ढूंढें)
  5. अपने NEW BUNDLE TARGET में, "चरण बनाएँ" में, "प्रतिलिपि बंडल संसाधन" अनुभाग जोड़ें, और इसमें सभी PNG फ़ाइलें आदि खींचें / छोड़ें।

स्क्रिप्ट को अपने FAT स्टेटिक लाइब्रेरी के समान फ़ोल्डर में बिल्ट बंडल (ओं) को ऑटो-कॉपी करें:

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
मैंने अब कुछ परियोजनाओं पर इसका उपयोग किया है, और ऐप-स्टोर में सामान भेज दिया है जो पुस्तकालयों के निर्माण के लिए इसका उपयोग करता है। सभी ने 100% ठीक काम किया, इसलिए मैं अब तक (Xcode 4 तक, शायद) इसके साथ चिपका रहा हूँ
एडम

2
क्या कोई पुष्टि कर सकता है कि यह विधि XCode 4.5 के लिए काम करती है? मैं एक स्थैतिक पुस्तकालय को संकलित करने और अपने मुख्य प्रोजेक्ट में उपयोग करने का प्रयास कर रहा हूं। मैं इसे डिवाइस पर चलाने में सक्षम हूं, लेकिन सिम्युलेटर पर नहीं। यह मुझे मिलने वाली त्रुटि है: फ़ाइल /User/alex/Documents/iphone/production/iphone/mymedia/libMyUnrar4iOS.a (2 स्लाइस)
Alex1987

2
किसी भी विचार कैसे XCode 5 और ARM64 के साथ यह काम करने के लिए? अगर मैं आर्किटेक्चर को मानक के रूप में छोड़ता हूं, तो यह अपेक्षित रूप से armv7, armvs7 और i386 के साथ पुस्तकालय बनाता है। यदि मैंने 64 बिट सहित मानक के लिए आर्किटेक्चर सेट किया है, तो लाइब्रेरी में केवल "cputype 16777223" शामिल है। मैं ओटूल -एच का उपयोग करता हूँ .a फ़ाइल को सत्यापित करने के लिए कि अंदर क्या है
रोजर बिन्स

1
XCode5 ने एक रन स्क्रिप्ट बिल्ड चरण को और भी मुश्किल बना दिया है। इसे बाहर की जाँच करें: starscriptbuildphase.com
फैबियो नेपोदानो

1
यह बिना किसी बदलाव के Xcode 6 पर ठीक काम करता प्रतीत होता है (केवल अब तक कुछ परियोजनाओं की कोशिश की है, और अभी तक कोई ऐप स्टोर अपडेट प्रस्तुत नहीं किया है, लेकिन सभी अभी तक ठीक काम कर रहे हैं)।
एडम

85

मैंने फैट स्टैटिक लाइब्रेरी बनाने की कोशिश में कई घंटे बिताए हैं जो armv7, armv7s और सिम्युलेटर पर काम करेंगे। अंत में एक हल मिला

अलग से दो पुस्तकालयों (डिवाइस के लिए एक और फिर सिम्युलेटर के लिए एक) का निर्माण करना है, उन्हें एक दूसरे से अलग करने के लिए नाम बदलें, और फिर उन्हें एक पुस्तकालय में बदल दें।

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

मैने इसे आजमाया और इसने कार्य किया!


4
मेरा सुझाव है कि आप स्वीकृत उत्तर पढ़ें। आप पा सकते हैं कि यह पहले से ही कवर किया गया है, 2 साल पहले ...
एडम

2
मैंने इसे पढ़ा, स्क्रिप्ट का इस्तेमाल किया, लेकिन यह मेरे लिए armv7s के लिए काम नहीं कर रहा था।
g_low

2
लिपो कमांड स्क्रिप्ट पर काम नहीं करता है, लेकिन मैन्युअल रूप से यह बहुत अच्छा काम करता है! 10x
दिमा

9
+1 यह वास्तव में मेरी ज़रूरत थी, न कि एक विशाल "मेक-इन-फ्रेमवर्क" स्क्रिप्ट।
LearnCocos2D

आपका सॉल्यूआरएल रिटर्न "एरर 404 - नॉट फाउंड"
एलेक्स

74

मैंने एक XCode 4 प्रोजेक्ट टेम्प्लेट बनाया है जो आपको एक नियमित रूप से लाइब्रेरी बनाने के रूप में आसानी से एक सार्वभौमिक ढांचा बनाने की अनुमति देता है।


इसे iOS 4.3 लक्ष्य के साथ नहीं बनाया जा सका। निम्न त्रुटि प्राप्त करें: -ddlib = libc ++ के लिए अमान्य परिनियोजन लक्ष्य (iOS 5.0 या बाद के संस्करण की आवश्यकता है)
Alex1987

काश मैं इस उत्तर के लिए अधिक प्रतिष्ठा अंक दे पाता ... एक स्थिर पुस्तकालय बनाने के लिए सीएमके का उपयोग करने की तुलना में बहुत आसान। यह करने के लिए आपका बहुत धन्यवाद!
२०

यह मेरे लिए iOS 6 के साथ भी काम करता है। लेकिन शायद यह इसलिए है क्योंकि मेरा काम काफी सरल है और किसी भी निर्भरता और संसाधनों के बिना
पॉलियस विन्दिज़ेल्किस

उस समाधान के साथ एक बड़ी समस्या है: अन्य जो इस समाधान के द्वारा बनाई गई रूपरेखा का उपयोग करना चाहते हैं (यह समाधान xcode को फ्रीमवर्क टेम्पलेट स्थापित करने का सुझाव देता है) इस टेम्पलेट को THEIR xcode पर स्थापित करें !!!
ईवा

आपको केवल वास्तविक रूपरेखाओं के लिए टेम्पलेट स्थापित करना होगा। नकली फ्रेमवर्क अनमॉडिफाइड Xcode में ठीक चलेगा।
कार्ल

30

एक कमांड-लाइन उपयोगिता है xcodebuildऔर आप xcode के भीतर शेल कमांड चला सकते हैं। इसलिए, यदि आपको कस्टम स्क्रिप्ट का उपयोग करने में कोई आपत्ति नहीं है, तो यह स्क्रिप्ट आपकी मदद कर सकती है।

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

शायद अक्षम दिखता है (मैं शेल स्क्रिप्ट में अच्छा नहीं हूं), लेकिन समझना आसान है। मैंने केवल इस स्क्रिप्ट को चलाकर एक नया लक्ष्य कॉन्फ़िगर किया है। स्क्रिप्ट को कमांड-लाइन के लिए डिज़ाइन किया गया है लेकिन इसमें परीक्षण नहीं किया गया है :)

मूल अवधारणा है xcodebuildऔर lipo

मैंने Xcode UI के भीतर कई कॉन्फ़िगरेशन की कोशिश की, लेकिन कुछ भी काम नहीं किया। क्योंकि यह एक प्रकार का बैच प्रोसेसिंग है, इसलिए कमांड-लाइन डिज़ाइन अधिक उपयुक्त है, इसलिए ऐप्पल ने धीरे-धीरे Xcode से बैच बिल्ड फीचर को हटा दिया। इसलिए मुझे उम्मीद नहीं है कि वे भविष्य में UI आधारित बैच बिल्ड सुविधा प्रदान करेंगे।


धन्यवाद, यह वास्तव में दिलचस्प है कि अंतर्निहित सरल कमांड अभी भी काम करते दिखाई देते हैं - यह सिर्फ इतना है कि ऐप्पल ने अपने जीयूआई को शानदार ढंग से तोड़ दिया। ऐसा लगता है कि मैं पूरी तरह से कस्टम प्रोजेक्ट टेम्प्लेट बना सकता हूं जो "चूसना नहीं करेगा" और सभी टारगेट को पूर्व-निर्मित करके, और Apple को तोड़ दी गई चीजों को ठीक करना, और इस स्क्रिप्ट को xcode build vars के साथ वायर करना। मैं इसे अपने अगले प्रोजेक्ट
एडम

1
मैंने इसके समान एक स्क्रिप्ट का उपयोग किया और इसे केवल शेल स्क्रिप्ट वाले एक नए लक्ष्य के तहत रखा। ऊपर की पुनरावर्ती बिल्ड स्क्रिप्ट बहुत चालाक है, लेकिन अनावश्यक रूप से भ्रमित है।
बेंजोएड

1
मैं इस तरह से सामान के लिए शेल स्क्रिप्ट पसंद करता हूं, यहां मेरा जिस्ट है। gith.github.com/3178578
slf

@benzado हाँ, मैंने जानबूझकर जटिलता से परहेज किया क्योंकि मुझे लगता है कि शेल स्क्रिप्ट को संशोधित करने के लिए पढ़ना आसान होना चाहिए।
Eonil

लाइपो: इनपुट फ़ाइल नहीं खोल सकता: / डिबग-आईपोस /
दिमा

11

मुझे JsonKit के लिए एक फैट स्टैटिक लिब की जरूरत थी, इसलिए Xcode में एक स्टैटिक लिबास प्रोजेक्ट बनाया और फिर प्रोजेक्ट डायरेक्टरी में इस बैश स्क्रिप्ट को चलाया। जब तक आपने xcode प्रोजेक्ट को कॉन्फ़िगर किया है "केवल सक्रिय कॉन्फ़िगरेशन बनाएँ" बंद कर दिया है, आपको सभी आर्किटेक्चर को एक ही परिवाद में प्राप्त करना चाहिए।

#!/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 अपडेट:

मुझे iphoneos10.0 के साथ फतली के निर्माण में एक समस्या थी क्योंकि स्क्रिप्ट में नियमित अभिव्यक्ति केवल 9.x और कम की उम्मीद करती है और ios 10.0 के लिए 0.0 रिटर्न देती है।

इसे ठीक करने के लिए बदलें

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

साथ में

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

धन्यवाद। मैंने आज सुबह भी ऐसा ही बदलाव किया है, लेकिन \ d का उपयोग किया है। मुझे लगता है कि यह वही है जो हम चाहते हैं (यह आपके से बेहतर या बुरा है?) ... grep -o '\ d \ {1,2 \} \ "। \ D \ {2 \} $'
एडम

मुझे लगता है कि मेरा और अधिक विश्वसनीय है, क्योंकि यह केवल संख्या मानता है
बेन

1
नहीं, तुम्हारा अंक लिखने के 1 विशेष तरीके से मेल खाता है। दिए गए वर्णों और पाठ के लिए (और उपयोग के लिए) Apple के ऐतिहासिक समर्थन (जैसे फ़ाइलनाम में) को देखते हुए मुझे उम्मीद है कि आपके कुछ अंकों का मालिकाना चयन कम विश्वसनीय होगा।
एडम

1
ठीक है शायद तुम सही हो। कम से कम मेरा मिला अपने प्रोजेक्ट भी काम कर रहे हैं और हम अगले 89 iOS संस्करण के लिए सुरक्षित हैं
बेन

@बेन समाधान मेरे लिए काम करता है, एडम का रेग्क्स '[\\ 0-9] \ {3,4 \} $' त्रुटि कोड 2 देता है
Zee

4

मैंने इसे Xcode 4 टेम्प्लेट में बनाया है , कार्ल के स्टैटिक फ्रेमवर्क टेम्पलेट के समान शिरा में।

मैंने पाया कि स्थैतिक ढांचे (सादे स्थैतिक पुस्तकालयों के बजाय) एलएलवीएम के साथ यादृच्छिक दुर्घटनाओं का कारण बन रहा था, एक स्पष्ट लिंकर बग के कारण - तो, ​​मुझे लगता है कि स्थिर पुस्तकालय अभी भी उपयोगी हैं!


हाय माइकल, मैंने आपके स्थिर पुस्तकालय टेम्पलेट की कोशिश की है, लेकिन मैं सिम्युलेटर के लिए संकलन कर सकता हूं, लेकिन डिवाइस के लिए नहीं, यहां त्रुटि: ** भवन विफल ** निम्नलिखित बिल्ड कमांड विफल रहे: ProcessPCH / var / फ़ोल्डरों / qy / ncy6fkkn6677qt876ljrc54m0000gn / C / com .apple.Xcode.501 / SharedPrecompiledHeaders / MenuBarUniversal-Prefix-gwxxzpanxyudmfgryorafazokagi / MenuBarUniversal-Prefix .pth MenuBarUniversal / MenuBarUniversal / MenuBarUniversal-Prefix.pfix.com .pdf सामान्य शाखाएं। ) पहले 200 नोटिस केवल कमांड / बिन / श
दिखाते

2

अच्छा काम! मैंने कुछ इसी तरह एक साथ हैक किया, लेकिन इसे अलग से चलाना पड़ा। यह सिर्फ निर्माण प्रक्रिया का हिस्सा होने के नाते यह इतना आसान बना देता है।

नोट की एक वस्तु। मैंने देखा कि यह उन फ़ाइलों को शामिल नहीं करता है जिन्हें आप सार्वजनिक रूप से चिह्नित करते हैं। मैंने अपनी स्क्रिप्ट में जो कुछ भी आपके पास है उसे अनुकूलित किया है और यह काफी अच्छी तरह से काम करता है। अपनी स्क्रिप्ट के अंत में निम्नलिखित पेस्ट करें।

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
ठीक है, मैंने इसे ऊपर दिए गए उत्तर में जोड़ दिया है। (अभी तक इसका परीक्षण करने का मौका नहीं मिला है, लेकिन मुझे सही लगता है)
एडम

1

मैंने वास्तव में सिर्फ इस उद्देश्य के लिए अपनी स्क्रिप्ट लिखी थी । यह Xcode का उपयोग नहीं करता है। (यह गाम्बित स्कीम परियोजना में एक समान स्क्रिप्ट पर आधारित है।)

मूल रूप से, यह चलता है ।/configure और तीन बार (i386, armv7, और armv7s के लिए) बनाते हैं, और परिणामी पुस्तकालयों में से प्रत्येक को एक फैब लिब में शामिल करते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.