এক্সকোড এবং এসডিকে 4+ ব্যবহার করে ফ্যাট স্ট্যাটিক লাইব্রেরি (ডিভাইস + সিমুলেটর) তৈরি করুন


283

দেখা যাচ্ছে যে আমরা - তাত্ত্বিকভাবে - একটি একক স্ট্যাটিক লাইব্রেরি তৈরি করতে পারি যাতে সিমুলেটর এবং আইফোন এবং আইপ্যাড উভয়ই থাকে।

যাইহোক, অ্যাপলটির এটির কোনও নথি নেই যা আমি খুঁজে পেতে পারি এবং এক্সকোডের ডিফল্ট টেম্পলেটগুলি এটি করার জন্য কনফিগার করা হয়নি।

আমি একটি সাধারণ, পোর্টেবল, পুনরায় ব্যবহারযোগ্য টেকনিক খুঁজছি যা এক্সকোডের অভ্যন্তরে করা যায়।

কিছু ইতিহাস:

  • ২০০৮ সালে, আমরা একক স্ট্যাটিক-লিব তৈরি করতে সক্ষম হয়েছি যা সিম এবং ডিভাইস উভয়ই অন্তর্ভুক্ত করে। অ্যাপল সেটি অক্ষম করেছে।
  • ২০০৯-এর জুড়ে, আমরা স্ট্যাটিক লিবসের জোড়া তৈরি করেছিলাম - একটি সিমের জন্য, একটি ডিভাইসের জন্য। অ্যাপলও এখন তা অক্ষম করেছে।

তথ্যসূত্র:

  1. এটি একটি দুর্দান্ত ধারণা, এটি একটি দুর্দান্ত পদ্ধতি, তবে এটি কার্যকর হয় না: http://www.drobnik.com/touch/2010/04/universal-static-libraries/

    • তার স্ক্রিপ্টে কিছু বাগ রয়েছে যার অর্থ এটি কেবল তার মেশিনে কাজ করে - তার উচিত "অনুমান" না করে BUILT_PRODUCTS_DIR এবং / অথবা BUILD_DIR ব্যবহার করা উচিত)
    • অ্যাপলের সর্বশেষতম এক্সকোড আপনাকে যা করেছে তা করতে আপনাকে বাধা দেয় - এক্সকোড কীভাবে টার্গেটগুলি প্রসেস করে (ডকুমেন্টেড) পরিবর্তনের ফলে এটি কার্যকর হবে না simply
  2. অন্য একজন প্রশ্নকর্তা কীভাবে এক্সকোড ব্যতীত এটি করবেন এবং আর্ম 6 বনাম আর্ম 7 অংশের উপর দৃষ্টি নিবদ্ধ করা প্রতিক্রিয়া সহ জিজ্ঞাসা করেছিলেন - তবে i386 অংশটিকে উপেক্ষা করেছেন: আমি কীভাবে একটি বাহ্যিক লাইব্রেরি (ফ্যাট) আর্মভি 6, আর্মভি 7 এবং আই 386 সংকলন করব?

    • অ্যাপলের সর্বশেষ পরিবর্তন হিসাবে, সিমুলেটর অংশটি আর -6 / আর্ম 7 পার্থক্যের মতো আর নয় - এটি একটি ভিন্ন সমস্যা, উপরে দেখুন)

শুধু ভাবছি - আপনি কেন এটি চান? এটি কি ডিভাইসে লাইব্রেরিটিকে বড় এবং ভারী করে তোলে না?
ক্রেগোক্স

3
@ কাভাস - লাইব্রেরির "ওজন" বাস্তব-বিশ্বের 95% পরিস্থিতিতে অপ্রাসঙ্গিক - আমাদের বেশিরভাগের জন্য, বিশেষত উদাহরণস্বরূপ এমনকি একটি মাত্র ইউআইআইমেজভিউ প্রদর্শন করা তুলনামূলকভাবে ছোট ছোট are
আদম

1
@ কাওয়াস - ইতিমধ্যে, এখানে মানটি হ'ল আপনি অন্যদের পক্ষে আপনার লাইব্রেরিটি ব্যবহার / পুনরায় ব্যবহার করা খুব সহজ করে দিয়েছেন। এটি ওয়ান-স্টেজ ড্রাগ / ড্রপ প্রক্রিয়ায় পরিণত হয়।
আদম

4
@ কাওস - অবশেষে, একটি আশ্চর্যজনক মূল্যবান সুবিধা: দুর্ঘটনাক্রমে কাউকে "ভুল" সংকলিত লাইব্রেরি প্রেরণ করা এত সহজ - এক্সকোড শূন্য পরীক্ষা করে, এবং আনন্দের সাথে "ভুল" আর্কিটেকচারটিকে সেই নামযুক্ত ফাইলে সংকলন করবে যা আপনি ভেবেছিলেন "সঠিক" স্থাপত্য। অ্যাপল এই অঞ্চলে এক্সকোড ভাঙা রাখে - প্রতিটি নতুন সংস্করণে পরিবর্তিত হয় যার অর্থ "আপনার লিবটি সঠিকভাবে সংকলন করতে আপনি যে বোতামটি গতকাল চাপ দিয়েছিলেন সেটি আজ এটি ভুলভাবে সংকলন করবে"। যতক্ষণ না অ্যাপল আমাদের চারদিকে গোলযোগ বন্ধ করে দেয়, ততক্ষণ তাদের খারাপ ইউআই :) আমাদের ইডিয়ট প্রুফ করা দরকার।
আদম

1
সত্যিই দুর্দান্ত হবে! কারণ ঠিক এখন যেমনটি রয়েছে, আমরা সামান্য কিছু জটিল কিছুতেই সিমুলেটারের উপর নির্ভর করতে পারি না।
ক্রেগোক্স

উত্তর:


272

বিকল্প:

সর্বশেষ সংস্করণটির সহজ অনুলিপি / পেস্ট (তবে ইনস্টল নির্দেশাবলী বদলে যেতে পারে - নীচে দেখুন!)

কার্লের গ্রন্থাগারটি সেটআপ করতে অনেক বেশি প্রচেষ্টা নেয়, তবে দীর্ঘমেয়াদী সমাধান (এটি আপনার গ্রন্থাগারটিকে ফ্রেমওয়ার্কে রূপান্তরিত করে)।

এটি সংরক্ষণ করুন, তারপরে আর্কাইভ বিল্ডগুলির জন্য সমর্থন যুক্ত করতে এটির জন্য টুইট করুন - আর্কাইভ মোডের সাথে এই কাজটি সুন্দরভাবে তৈরি করতে তিনি যে পরিবর্তনগুলি ব্যবহার করছেন সে সম্পর্কে নীচে সিফ @ ফ্রেডেরিকের মন্তব্য।


সাম্প্রতিক পরিবর্তনসমূহ: 1. আইওএস 10.x (পুরানো প্ল্যাটফর্মগুলির জন্য সমর্থন বজায় রেখে) জন্য সমর্থন যুক্ত করা হয়েছে

  1. কোনও প্রকল্প-এম্বেড-ইন-অন্য-প্রকল্পের সাহায্যে এই স্ক্রিপ্টটি কীভাবে ব্যবহার করবেন সে সম্পর্কিত তথ্য (যদিও আমি এটির আগে কখনও তা না করার পরামর্শ দিই - আপনি যদি এক্সকোড থেকে একে অপরের অভ্যন্তরে প্রকল্পগুলি এম্বেড করেন তবে অ্যাপল এর এক্সকোডে বেশ কয়েকটি শো-স্টপার বাগ রয়েছে Apple 3.x এর মাধ্যমে Xcode 4.6.x)

  2. আপনাকে বান্ডেলগুলি স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত করতে বোনাস স্ক্রিপ্ট (যেমন আপনার লাইব্রেরি থেকে পিএনজি ফাইলগুলি, পিএলএসটি ফাইলগুলি অন্তর্ভুক্ত করুন!) - নীচে দেখুন (নীচে স্ক্রোল করুন)

  3. এখন আইফোন 5 সমর্থন করে (লিপোর বাগগুলিতে অ্যাপলের কাজটি ব্যবহার করে)। দ্রষ্টব্য: ইনস্টল নির্দেশাবলী পরিবর্তিত হয়েছে (ভবিষ্যতে স্ক্রিপ্ট পরিবর্তন করে আমি সম্ভবত এটি সহজ করতে পারি, তবে এখনই এটি ঝুঁকি নিতে চাই না)

  4. "অনুলিপি শিরোনাম" বিভাগ এখন পাবলিক শিরোনামগুলির অবস্থানের জন্য বিল্ডিং সেটিংটিকে সম্মান করে (ফ্রেডেরিক ওয়ালনার সৌজন্যে)

  5. ডাইম ডিকিনসনকে ধন্যবাদ, সাইম্রূটের সুস্পষ্ট সেটিং যুক্ত করা হয়েছে (সম্ভবত ওবিজ্রুটও সেট করা দরকার?), ধন্যবাদ


স্ক্রিপ্ট (এটি আপনার অনুলিপি / পেস্ট করতে হবে)

ব্যবহার / ইনস্টল নির্দেশাবলী জন্য, নীচে দেখুন

##########################################
#
# 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. একটি স্ট্যাটিক lib প্রকল্প তৈরি করুন
  2. লক্ষ্য নির্বাচন করুন
  3. "বিল্ড সেটিংস" ট্যাবটিতে "কেবল সক্রিয় আর্কিটেকচার তৈরি করুন" "" না "( সমস্ত আইটেমের জন্য) সেট করুন
  4. "বিল্ড পর্যায়সমূহ" ট্যাবে "অ্যাড ... নতুন বিল্ড ফেজ ... নতুন রান স্ক্রিপ্ট বিল্ড ফেজ" নির্বাচন করুন
  5. স্ক্রিপ্টটি কপি / পেস্ট করুন (উপরে) বাক্সে

... বোনাস বিকল্প বিকল্প:

  1. বিকল্প: আপনার লাইব্রেরিতে যদি শিরোনাম থাকে তবে এগুলিকে "অনুলিপি শিরোনাম" পর্যায়ে যুক্ত করুন
  2. বিকল্প: ... এবং এগুলিকে "প্রকল্প" বিভাগ থেকে "পাবলিক" বিভাগে টেনে আনুন / ছাড়ুন
  3. বিকল্প: ... এবং এগুলি স্বয়ংক্রিয়ভাবে আপনি যখনই অ্যাপটি তৈরি করবেন তখনই "ডিবাগ-ইউনিভার্সাল" ডিরেক্টরিটির একটি উপ-ডিরেক্টরিতে রফতানি করা হবে (তারা ইউএস / স্থানীয় / অন্তর্ভুক্ত থাকবে)
  4. ঐচ্ছিক: নোট: আপনি এছাড়াও / টেনে আনার চেষ্টা অন্য Xcode প্রকল্পে আপনার প্রকল্পের ড্রপ, এই একটি বাগ Xcode 4, যেখানে এটি একটি .IPA ফাইল যদি আপনি আপনার ড্র্যাগ পাবলিক শিরোলেখ নেই তৈরি করতে পারে অনাবৃত / প্রকল্প ছেড়ে দিয়েছিলেন। কার্যতালিকা: এক্সবেড প্রকল্পগুলি এম্বেড করবেন না (অ্যাপলের কোডে অনেকগুলি বাগ রয়েছে!)

যদি আপনি আউটপুট ফাইলটি খুঁজে না পান তবে এখানে একটি কার্যকারিতা রয়েছে:

  1. স্ক্রিপ্টের একেবারে শেষে (ফ্রেডেরিক ওয়ালনার সৌজন্যে) নীচের কোডটি যুক্ত করুন: "$ {CREATING_UNIVERSAL_DIR}" খুলুন

  2. অ্যাপল 200 লাইন পরে সমস্ত আউটপুট মোছা। আপনার টার্গেটটি নির্বাচন করুন এবং স্ক্রিপ্ট পর্বে রান করুন, আপনাকে অবশ্যই এটি অচেনা করতে হবে: "বিল্ড লগে পরিবেশের ভেরিয়েবলগুলি দেখান"

  3. আপনি যদি এক্সকোড 4 এর জন্য একটি কাস্টম "বিল্ড আউটপুট" ডিরেক্টরি ব্যবহার করছেন, তবে এক্সকোড আপনার সমস্ত "অপ্রত্যাশিত" ফাইলগুলিকে ভুল জায়গায় রাখে।

    1. প্রকল্প তৈরি করুন
    2. Xcode4 এর উপরের বাম দিকের ডানদিকে সর্বশেষ আইকনটিতে ক্লিক করুন।
    3. শীর্ষস্থানীয় আইটেমটি নির্বাচন করুন (এটি আপনার "অতি সাম্প্রতিক বিল্ড" Apple অ্যাপলকে এটি স্বয়ংক্রিয়ভাবে নির্বাচন করা উচিত, তবে তারা এটি ভেবে দেখেনি)
    4. মূল উইন্ডোতে নীচে স্ক্রোল করুন। একেবারে শেষ লাইনে পড়তে হবে: লিপো: বর্তমান কনফিগারেশনের জন্য (ডিবাগ) আউটপুট ফাইল তৈরি করা: / ব্যবহারকারী / ব্লা / লাইবারি / ডেভেলপার / এক্সকোড / ডেরিভডডাটা / অ্যাপনাম -আশবানবুটভোডমোলেজলসিডুডসেকিফ / বিল্ড / প্রোডাক্টস / ডেবেগ- ইউনিভার্সাল / লিবিট্রেটনেম.আ.

    ... এটি আপনার ইউনিভার্সাল বিল্ডের অবস্থান।


আপনার প্রকল্পে "নন সোর্সকোড" ফাইলগুলি কীভাবে অন্তর্ভুক্ত করবেন (পিএনজি, পিআইএলএসটি, এক্সএমএল, ইত্যাদি)

  1. উপরের সমস্ত কিছু করুন, এটি কাজ করে দেখুন
  2. প্রথম চালুর পরে একটি নতুন রান স্ক্রিপ্ট ফেজ তৈরি করুন (নীচের কোডটি অনুলিপি / পেস্ট করুন)
  3. এক্সকোডে "বান্ডিল" টাইপ করে একটি নতুন টার্গেট তৈরি করুন
  4. আপনার মেইন প্রজেক্টে, "বিল্ড পর্যায়গুলি" তে, নতুন বান্ডিলটিকে "নির্ভর করে" এমন কিছু হিসাবে যুক্ত করুন (শীর্ষ বিভাগ, প্লাস বোতামটি চাপুন, নীচে স্ক্রোল করুন, আপনার পণ্যগুলিতে ".বান্ডেল" ফাইলটি সন্ধান করুন)
  5. আপনার নতুন বান্ডেল টার্গেটে, "বিল্ড পর্যায়গুলি" তে, একটি "কপি বান্ডিল রিসোর্স" বিভাগ যুক্ত করুন এবং এতে সমস্ত পিএনজি ফাইল ইত্যাদি টেনে আনুন / ছাড়ুন

আপনার 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
এই পদ্ধতিটি এক্সকোড ৪.৫ এর জন্য কাজ করে কি কেউ নিশ্চিত করতে পারবেন? আমি একটি স্থির গ্রন্থাগার সংকলন এবং এটি আমার মূল প্রকল্পে ব্যবহার করার চেষ্টা করছি। আমি এটি ডিভাইসে চালাতে সক্ষম তবে সিমুলেটরটিতে নয়। এই ত্রুটিটি আমি পেয়েছি: ফাইল / ইউজারস
অ্যালেক্স

2
এক্সকোড 5 এবং এআরএম 64 দিয়ে কীভাবে এই কাজটি করবেন তা সম্পর্কে কোনও ধারণা? আমি যদি আর্কিটেকচারকে স্ট্যান্ডার্ড হিসাবে ছেড়ে দিই, তবে এটি আর্মভি 7, আর্মভিএস 7 এবং আই 386 দিয়ে প্রত্যাশা অনুযায়ী লাইব্রেরি তৈরি করে। যদি আমি bit৪ বিবিট সহ স্ট্যান্ডার্ডকে সেট করে রাখি তবে লাইব্রেরিতে কেবল "সিপুটাইপ 16777223" রয়েছে। ভিতরে কী আছে তা যাচাই করতে আমি .a ফাইলটিতে otool -h ব্যবহার করি
রজার বিনস

1
এক্সকোড 5 রান স্ক্রিপ্ট বিল্ড ফেজ যোগ করা আরও জটিল করে তুলেছে। এটি দেখুন: রানস্ক্রিপ্টবিল্ডফেস.কম
ফ্যাবিও নেপোডানো

1
এটি কোনও পরিবর্তন ছাড়াই এক্সকোড 6 তে সূক্ষ্মভাবে কাজ করে বলে মনে হচ্ছে (কেবল এখন পর্যন্ত বেশ কয়েকটি প্রকল্পের চেষ্টা করা হয়েছে, এবং এখনও কোনও অ্যাপ স্টোর আপডেট জমা দেয়নি, তবে এখন পর্যন্ত সবগুলি ঠিকঠাক কাজ করছে)।
আদম

85

আমি একটি ফ্যাট স্ট্যাটিক লাইব্রেরি তৈরির চেষ্টা করে অনেক ঘন্টা ব্যয় করেছি যা আর্মভ 7, আর্মভ 7 এবং সিমুলেটরটিতে কাজ করবে। অবশেষে একটি সমাধান খুঁজে পেয়েছি

সংক্ষেপে দুটি গ্রন্থাগার (একটি ডিভাইসের জন্য এবং তারপরে একটি সিমুলেটারের জন্য) আলাদাভাবে তৈরি করা, একে অপরের থেকে আলাদা করার জন্য তাদের নতুন নামকরণ করা এবং তারপরে লাইপো তৈরি করে একটি লাইব্রেরিতে তৈরি করা হয়।

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

আমি চেষ্টা করেছিলাম এবং এটি কাজ করে!


4
আমি আপনাকে গৃহীত উত্তরটি পড়ার পরামর্শ দিচ্ছি। আপনি দেখতে পাবেন যে এটি ইতিমধ্যে 2 বছর আগে কভার করা হয়েছে ...
অ্যাডাম

2
আমি এটি পড়েছি, স্ক্রিপ্টটি ব্যবহার করেছি, তবে এটি আমার পক্ষে আর্মভ 7 এর জন্য কাজ করছে না।
g_low

2
লিপো কমান্ড স্ক্রিপ্টটিতে কাজ করে না, তবে ম্যানুয়ালি এটি দুর্দান্তভাবে কাজ করে! 10x
ডিমা

9
+1 আমার যা দরকার তা আসলেই ছিল, বিশাল "মেক-এ-ফ্রেমওয়ার্ক" স্ক্রিপ্ট নয়।
শিখুন কোকোস

আপনার সমাধান URL ফেরত "ত্রুটি 404 - পাওয়া যায় নি"
অ্যালেক্স

74

আমি একটি এক্সকোড 4 প্রকল্পের টেমপ্লেট তৈরি করেছি যা আপনাকে নিয়মিত পাঠাগার তৈরি করার মতো সহজেই একটি সর্বজনীন কাঠামো তৈরি করতে দেয়।


আইওএস ৪.৩ লক্ষ্য নিয়ে এটি তৈরি করতে পারেনি। নিম্নলিখিত ত্রুটিটি পান: -stdlib = libc ++ এর জন্য অবৈধ স্থাপনার লক্ষ্য (আইওএস 5.0 বা তার পরে প্রয়োজন)
অ্যালেক্স 1987

আমি আশা করি আমি এই উত্তরের জন্য আরও খ্যাতি পয়েন্ট দিতে পারতাম ... একটি স্থিতাগত গ্রন্থাগার তৈরি করতে সিএমকে ব্যবহার করার চেয়ে অনেক সহজ। এই কাজ করার জন্য আপনাকে অনেক ধন্যবাদ!
iwasrobbed

এটি আমার জন্য আইওএস 6 এর সাথেও কাজ করে। তবে সম্ভবত এটি হ'ল আমার
লিবটি

এই সমাধানটির সাথে একটি বিরাট সমস্যা রয়েছে: অন্যান্য যারা এই সমাধানটি তৈরির কাঠামোটি ব্যবহার করতে চান (এই সমাধানটি এক্সকোডে ফ্রেমওয়ার্ক টেম্পলেট ইনস্টল করার পরামর্শ দেয়) এই টেমপ্লেটটি তাদের এক্সকোডে ইনস্টল করতে হবে !!!
এভিয়া

আপনাকে কেবল বাস্তব ফ্রেমওয়ার্কের জন্য টেম্পলেট ইনস্টল করতে হবে। জাল ফ্রেমওয়ার্কগুলি অশোধিত এক্সকোডে সূক্ষ্মভাবে চলবে।
কার্ল 21

30

একটি কমান্ড-লাইন ইউটিলিটি রয়েছে xcodebuildএবং আপনি এক্সকোডের মধ্যে শেল কমান্ড চালাতে পারেন। সুতরাং, আপনি যদি কাস্টম স্ক্রিপ্ট ব্যবহার করতে আপত্তি না করেন তবে এই স্ক্রিপ্টটি আপনাকে সহায়তা করতে পারে।

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

অদক্ষ মনে হচ্ছে (আমি শেল স্ক্রিপ্টে ভাল নই) তবে বুঝতে সহজ to আমি কেবল এই স্ক্রিপ্টটি চালিয়ে একটি নতুন লক্ষ্য কনফিগার করেছি। স্ক্রিপ্টটি কমান্ড-লাইনের জন্য ডিজাইন করা হয়েছে তবে এটি পরীক্ষিত নয় :)

মূল ধারণাটি হ'ল xcodebuildএবং lipo

আমি এক্সকোড ইউআইয়ের মধ্যে অনেকগুলি কনফিগারেশন চেষ্টা করেছি, কিন্তু কিছুই কার্যকর হয়নি। কারণ এটি এক ধরণের ব্যাচ প্রক্রিয়াজাতকরণ, সুতরাং কমান্ড-লাইন নকশাটি আরও উপযুক্ত, তাই অ্যাপল ধীরে ধীরে এক্সকোড থেকে ব্যাচ বিল্ড বৈশিষ্ট্যটি সরিয়ে ফেলল। সুতরাং আমি আশা করি না যে তারা ভবিষ্যতে ইউআই ভিত্তিক ব্যাচ বিল্ড বৈশিষ্ট্য সরবরাহ করবে।


ধন্যবাদ, এটি সত্যই আকর্ষণীয় যে অন্তর্নিহিত সরল কমান্ডগুলি এখনও কাজ করতে দেখা যায় - অ্যাপল তাদের জিইউআইকে দর্শনীয়ভাবে ভেঙেছে it's দেখে মনে হচ্ছে যে আমি একটি সম্পূর্ণ কাস্টম প্রজেক্ট টেমপ্লেট তৈরি করতে পেরেছিলাম যা সমস্ত লক্ষ্যগুলি প্রাক-তৈরি করে এবং এক্সকোড বিল্ড ওয়ার্সের সাহায্যে এই স্ক্রিপ্টটি ওয়্যারিং করে অ্যাপল ভেঙে দেওয়া জিনিসগুলিকে "স্তন্যপান করবে না" এবং ঠিক করতে পারে। আমি এটি আমার পরবর্তী প্রজেক্টে চেষ্টা করে দেখব :)
অ্যাডাম

1
আমি এটির মতো স্ক্রিপ্ট ব্যবহার করেছি এবং এটি কেবলমাত্র শেল স্ক্রিপ্টযুক্ত একটি নতুন লক্ষ্যের অধীনে রেখেছি। উপরের রিকার্সিভ বিল্ড স্ক্রিপ্টটি খুব চতুর, তবে অহেতুক বিভ্রান্তিকর।
বেনজাদো

1
আমি এই জাতীয় জিনিসগুলির জন্য শেল স্ক্রিপ্টগুলি পছন্দ করি, এখানে আমার gist.github.com/3178578
এসএফএফ

@ বেনজাদো হ্যাঁ আমি ইচ্ছাকৃতভাবে জটিলতা এড়িয়ে গেছি কারণ আমি মনে করি যে শেল স্ক্রিপ্টটি পরিবর্তন করার জন্য পড়া সহজ হবে।
ইনিল

লিপো: ইনপুট ফাইলটি খুলতে পারে না: / ডিবাগ-iphoneos /
ডিমা

11

আমি জসনকিটের জন্য একটি চর্বিযুক্ত স্ট্যাটিক লাইব প্রয়োজন তাই এক্সকোডে একটি স্ট্যাটিক লাইব প্রকল্প তৈরি করে এবং তারপরে প্রকল্প ডিরেক্টরিতে এই বাশ স্ক্রিপ্টটি চালায়। যতক্ষণ আপনি "কেবলমাত্র সক্রিয় কনফিগারেশন তৈরি করুন" বন্ধ করে দিয়ে এক্সকোড প্রকল্পটি কনফিগার করেছেন, আপনার সমস্ত আর্কিটেকচার একটি লিবিতে পাওয়া উচিত।

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

7

আইওএস 10 আপডেট:

আইফোনস 10.0 দিয়ে ফ্যাটলিব তৈরি করতে আমার সমস্যা হয়েছিল কারণ স্ক্রিপ্টে নিয়মিত প্রকাশটি কেবল 9.x এবং নিম্নের প্রত্যাশা করে এবং আইওএস 10.0 এর জন্য 0.0 প্রদান করে

এটি ঠিক করতে প্রতিস্থাপন

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

সঙ্গে

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

ধন্যবাদ। আমি আজ সকালে একই রকম পরিবর্তন করেছি, তবে used d ব্যবহার করেছি। এটি আমি মনে করি এটিই আমরা চাই (এটি কি আপনার চেয়ে ভাল বা খারাপ?) ... গ্রেপ -ও '\ d \ {1,2 \} \। \ d \ {2 \} $'
অ্যাডাম

আমি মনে করি যে খনিটি আরও নির্ভরযোগ্য যেহেতু এটি কেবল সংখ্যাগুলি বিবেচনা করে
বেন

1
না, আপনার 1 টি অঙ্কের বিশেষ পদ্ধতিতে মেলে। পূর্বনির্ধারিত অক্ষর এবং পাঠ্য (যেমন ফাইলের নাম) এর জন্য অ্যাপলের historicalতিহাসিক সমর্থন দেওয়া আমি আশা করি যে আপনার কয়েকটি অঙ্কের মালিকানা নির্বাচনটি কম নির্ভরযোগ্য হবে reliable
আদম

1
ঠিক আছে তুমি ঠিক আছো কমপক্ষে আমার আমার প্রকল্পটিও কাজ করেছে এবং আমরা পরবর্তী 89 আইওএস সংস্করণগুলির জন্য নিরাপদ
বেন

@ বেন সলিউশনটি আমার পক্ষে কাজ করে, অ্যাডামের রেজেক্স '[0। 0-9] {4 3,4 \} $' ত্রুটি কোড 2 দেয়
জি 8

4

কার্লের স্ট্যাটিক ফ্রেমওয়ার্ক টেম্পলেট হিসাবে একই শিরাতে আমি এটি একটি এক্সকোড 4 টেম্পলেট তৈরি করেছি ।

আমি দেখতে পেলাম যে স্ট্যাটিক ফ্রেমওয়ার্কগুলি (প্লেইন স্ট্যাটিক লাইব্রেরির পরিবর্তে) এলএলভিএমের সাথে এলোমেলো ক্র্যাশ ঘটায়, আপাত লিঙ্কার বাগের কারণে - সুতরাং, আমার ধারণা স্থির লাইব্রেরিগুলি এখনও কার্যকর!


হাই মাইকেল, আমি আপনার স্ট্যাটিক লাইব্রেরি টেমপ্লেটটি চেষ্টা করেছি তবে আমি সিমুলেটারের জন্য কিন্তু ডিভাইসের জন্য নয়, এখানে ত্রুটিটি সংকলন করতে পারি: ** বিল্ড ব্যর্থ হয়েছে ** নিম্নলিখিত বিল্ড কমান্ডগুলি ব্যর্থ হয়েছে: প্রসেসপিসিএইচ / var / ফোল্ডার / কিউআই / এনসি 6fkpn6677qt876ljrc54m0000gn / সি / কম .apple.Xcode.501 / SharedPrecompiledHeeda / MenuBarUniversal-Prefix-gwxxzpanxyudmfgryorafazokagi / MenuBarUniversal-Prefix.pch.pth মেনুবারউইভারসাল / মেনুবার ইউনিভারসাল.প্রেস.সিলেক.আর.সিলেক.আর। ) প্রথম 200 টি নোটিশ দেখানো কেবলমাত্র কমান্ড / বিন / এস প্রস্থান কোড 65 দিয়ে ব্যর্থ হয়েছে
কাপ্পে

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
ঠিক আছে, আমি এটি উপরের উত্তরে যুক্ত করেছি। (এটি এখনও পরীক্ষা করার সুযোগ পান নি, তবে আমার কাছে এটি সঠিক দেখাচ্ছে)
অ্যাডাম 15

1

আমি আসলে এই উদ্দেশ্যে আমার নিজের স্ক্রিপ্ট লিখেছিলাম । এটি এক্সকোড ব্যবহার করে না। (এটি গাম্বিট স্কিম প্রকল্পের একই স্ক্রিপ্টের ভিত্তিতে তৈরি।)

মূলত, এটি। / কনফিগার করে এবং তিনবার করে (i386, আর্মভি 7 এবং আর্মভি 7 এর জন্য) তৈরি করে এবং ফলাফল প্রাপ্ত গ্রন্থাগারগুলির প্রতিটিকে একটি ফ্যাট লিবিতে সংযুক্ত করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.