2009-07-31 16 views
24

मैं एक आईफोन ऐप बना रहा हूं जिसे सिम्युलेटर और डिवाइस दोनों पर चलाना है। हालांकि मैं एक बाहरी संकलित लाइब्रेरी का उपयोग कर रहा हूं जिसमें सिम्युलेटर के लिए एक संस्करण है और डिवाइस के लिए एक (अलग CPU) है।एक्सकोड: आर्किटेक्चर (डिवाइस (एआरएम) बनाम सिम्युलेटर (i386) पर आधारित सशर्त बिल्ड सेटिंग्स)

मैं यह कैसे कर सकता हूं? मैं विजुअल सी ++ से आ रहा हूं इसलिए मैं एक्सकोड में नया हूं, और मुझे ऐसा करने का तरीका नहीं मिल रहा है।

संपादित करें, मार्च 2016: इस सवाल को जुलाई 200 9 को लगभग 6 साल पहले पूछा गया था। एक्सकोड में बहुत कुछ बदल गया है, लेकिन मुझे लगता है कि कुछ सामान अभी भी है। अब स्वीकार्य उत्तर, उदाहरण के लिए, एक्सकोड v3 में एक विकल्प नहीं था।

उत्तर

26

मुझे Adobe Omniture की "AppMeasurement" लाइब्रेरी को एकीकृत करते समय यह समस्या थी, जो वर्तमान में 3 आर्किटेक्चर के लिए संकलित हो जाती है: libAppMeasurement-iOSSimulator.a, libAppMeasurement-iOSDevice.a, और libAppMeasurement-iOSDevice-armv7.a।

जबकि अन्य उत्तर यहां काफी सही हैं, मैं वास्तव में समझने के लिए कहीं और जाने के लिए समाप्त हुआ और फिर समस्या को ठीक करता हूं।

चरण 1. मुद्दों

यह blog post समग्र मुद्दा समझाने का बहुत अच्छा काम करता है समझना। यह Xcode 3 में समस्या को हल करने के लिए प्रारंभ-निर्देश समाप्त निर्देश देता है। एक्सकोड 4 के लिए नीचे देखें।

नोट: आप उस बिट को छोड़ने का प्रयास कर सकते हैं जहां वह स्थिर पुस्तकालयों को जोड़ने के लिए कहता है और फिर उन्हें हटा देता है। अगली बार जब मैं ऐसा करता हूं, तो शायद मैं हेडर फ़ाइल जोड़ दूंगा, फिर अन्य लिंकर ध्वज संपादित करने के लिए सीधे छोड़ दें। सेटिंग बिल्ड टैब पर पाठ फ़ील्ड drag- रहे &:

चरण 2. Xcode 4 में सशर्त सेटिंग बिल्ड

यह StackOverflow page Xcode में 4. टिप सशर्त निर्माण सेटिंग्स निर्धारित करने का नया तरीका बताते हैं -प्रॉप सक्षम; एक बार जब आप अन्य सैंडर फ्लैग के तहत संपादन के लिए अपनी सशर्त निर्माण सेटिंग तैयार कर लेंगे, तो आप केवल स्थिर फ़ील्ड फ़ाइल को टेक्स्ट फ़ील्ड पर खींच सकते हैं और एक्सकोड स्वचालित रूप से एक (उम्मीदवार रिश्तेदार) पथ दर्ज करेगा।

enter image description here __

+0

इसे 'अन्य लिंकर ध्वज' में खींचकर मेरे लिए काम किया।(सुनिश्चित करें कि आप इसे पहले डबल क्लिक करें, ताकि आप इसे पॉपओवर में खींच सकें, अगर आपको पहले से ही पंक्ति में सेटिंग्स मिल चुकी हैं।) – DouglasHeriot

+0

वाह, यह बहुत अच्छा है, उसे नहीं देखा। किसी भी विचार को .xcconfig फ़ाइलों में इसका प्रतिनिधित्व कैसे किया जाता है? मुझे lvm में gcc और -lrt_profile में -lgcov शामिल करने की आवश्यकता है! –

+1

मुझे यह पोस्ट मिला: http://www.cocoabuilder.com/archive/xcode/273938-os-xcode-conditional-build-setting.html यहां इसका मांस है: 1) एक कस्टम बिल्ड सेटिंग बनाएं GCC_VERSION_0310 = 4.2 2) एक कस्टम बिल्ड सेटिंग बनाएं GCC_VERSION_0320 = com.apple.compilers.llvmgcc42 3) GCC_VERSION को $ (GCC_VERSION _ $ (XCODE_VERSION_MINOR) परिभाषित करें) –

9

आप 3 विकल्प हैं:

  1. आप का निरीक्षण विंडो (जहां संकलक सेटिंग्स आदि को बदल सकते हैं,) यह है कि सेटिंग conditionalize के लिए एक विकल्प लाएगा अंदर की स्थापना निर्माण के नाम पर क्लिक को नियंत्रित करते हैं। बस उन लिंकर झंडे पर जाएं जिन्हें आप बदलना चाहते हैं, और उन्हें एसडीके द्वारा सशर्त बनाना, फिर प्रत्येक एसडीके के लिए विशिष्ट लाइब्रेरी दर्ज करें।

  2. वैकल्पिक रूप से आप पुस्तकालय लेने के लिए और प्रत्येक SDKs जड़ ("/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib/" और में एक ही पथ पर इसे स्थापित "कर सकते हैं /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk/usr/lib ")। चूंकि एसडीके रिश्तेदार पुस्तकालय खोज पथ का उपयोग किया जाता है, इसलिए उपयुक्त संस्करण को या तो निर्माण के लिए खींचा जाएगा।

  3. आप दो पुस्तकालयों को एक वसा पुस्तकालय में लिपो कर सकते हैं। यह शायद एक बुरा विचार है, लेकिन यदि आप इसे करना चाहते हैं तो manpage चेकआउट करें।

+1

एक वसा lib में lipo'ing * जरूरी नहीं है * एक बुरा विचार बी/सी किसी भी अप्रयुक्त आर्किटेक्चर हटा दिए जाते हैं। यह अनिवार्य रूप से पतला lib के खिलाफ जोड़ने के समान ही है। एकमात्र कमी जो मैं देख सकता हूं वह सार्वभौमिक वसा lib से वर्तमान आर्क निकालने के लिए अतिरिक्त कुछ सेकंड ले सकता है। मैं व्यक्तिगत रूप से अपनी परियोजनाओं में कई कस्टम लिपोड वसा libs का उपयोग करता हूं क्योंकि यह फाइलों की मात्रा को कम करता है जो एक्सकोड को इंडेक्स की आवश्यकता होती है और फाइलों की कुल संख्या मुझे सोचने के लिए होती है)। अच्छा जवाब हालांकि! – chown

3

यह करने के लिए सुझाया गया तरीका अपनी परियोजना और लक्षित करने के लिए पुस्तकालय जोड़ नहीं है, लेकिन इसके बजाय विन्यास प्रति लिंक लायब्रेरी के लिए अलग, प्रत्यक्ष संदर्भ शामिल करने के लिए अन्य लिंकर झंडे स्थापित करने के लिए।

डिबग के लिए:

OTHER_LINKER_FLAGS = -l/Path/To/My/Debug/Library.dylib 

रिलीज

OTHER_LINKER_FLAGS = -l/Path/To/My/Release/Library.dylib 

के लिए आप अन्य निर्माण सेटिंग में पाठ्यक्रम उपयोग संदर्भ इन रास्तों कुछ टिकाऊ के सापेक्ष बनाना, या एक बाहरी करने के लिए एक स्रोत ट्री का उपयोग करने के कर सकते हैं स्रोत पेड़

+0

यह सवाल का जवाब नहीं देता है। सवाल डिवाइस/सिम्युलेटर के बारे में था, डीबग/रिलीज नहीं। हम अक्सर लक्ष्य डिवाइस/सिम्युलेटर के आधार पर दो पुस्तकालय प्राप्त करते हैं। – zaph

+0

निष्पक्ष होने के लिए, जुलाई 200 9 में जब मैंने अपना उत्तर पोस्ट किया, और कॉन्फ़िगरेशन का उपयोग करना ही ऐसा करने का एकमात्र तरीका था, तो सेटिंग सेटिंग बनाना मौजूद नहीं था। – cdespinosa

1

एक्सकोड 3.2.1 में विकल्प 1 (लुई गेरबर्ग उत्तर देखें) के लिए "अन्य लिंकर ध्वज" का चयन करें और फिर बिल्ड सेटिंग विंडो के निचले बाएं भाग पर ड्रॉपडाउन मेनू से "बिल्ड सेटिंग कंडीशन जोड़ें" चुनें। "अन्य लिंकर ध्वज" वाक्यविन्यास के लिए cdespinosa उत्तर देखें)

या यदि आप अलग-अलग निर्देशिकाओं में डिवाइस/सिम्युलेटर पुस्तकालय हैं तो आप "लाइब्रेरी खोज पथ" में "बिल्ड सेटिंग कंडीशन" भी जोड़ सकते हैं।

1

अन्य लिंकर झंडे और पुस्तकालयों को जोड़ने में समस्या पुस्तकालयों के लिंक ऑर्डर को नियंत्रित कर रही है जो महत्वपूर्ण हो सकती हैं। ऐसा लगता है कि लिंकर फ्लैग संस्करण का अर्थ है कि ये पुस्तकालय पहले आएंगे, इसलिए यदि आप पहले आने वाले एक्सकोड में अन्य पुस्तकालयों का प्रबंधन कर रहे हैं, तो आपको उसे छोड़ना होगा और सब कुछ अन्य लिंकर झंडे में ले जाना होगा ...! - पी

0

मेरे एक्सकोड 3.2.3 में, सही नामकरण OTHER_LDFLAGS प्रतीत होता है, न कि OTHER_LINKER_FLAGS।

5

किसी के लिए जैसे चेतावनी भर आता है ":

यहाँ मेरी अन्य लिंकर झंडे एक बार मैं" लापता आवश्यक वास्तुकला i386 "कोई निर्माण त्रुटियों के साथ दूर जाना चेतावनी मिल गया का एक स्क्रीनशॉट [lib_for_sim_or_device] आर्किटेक्चर के लिए नहीं बनाया गया है ... ", तृतीय पक्ष लाइब्रेरी फ़ोल्डर को प्रोजेक्ट में खींचते समय चेतावनी उत्पन्न होती है।

दृश्य के पीछे एक्सकोड स्वचालित रूप से लाइब्रेरी फ़ाइलों को 'लक्ष्य सेटिंग -> वाक्यांश बनाएं -> लाइब्रेरीज़ अनुभागों के साथ लिंक बाइनरी' में जोड़ता है, जो दोनों पुस्तकालयों के साथ जुड़ने का कारण बनता है।

कि ठीक करने के लिए, 'पुस्तकालय के साथ लिंक बाइनरी' से इन प्रविष्टियों को हटाने, और फिर सिम/डिवाइस '

आशा है कि यह मदद करता है के लिए सशर्त इमारत सेटिंग पर ऊपर गाइड का पालन करें!

संबंधित मुद्दे