2011-06-09 7 views
9

में स्थिर पुस्तकालयों के साथ हैडर प्रबंधन Xcode 4 में स्थिर लाइब्रेरी शीर्षलेख आयात करने के लिए सबसे अच्छा अभ्यास है? मेरी अधिकांश परियोजनाएं कई अन्य परियोजनाओं पर निर्भर करती हैं, ताकि मैंने हाल ही में एक स्थान से सभी आवश्यक मॉड्यूल बनाने के लिए वर्कस्पेस सुविधा का उपयोग करना शुरू कर दिया है (जो मुझे बहुत सुविधाजनक लगता है)।एक्सकोड 4

क्या बेकार है कि हम आईओएस पर कस्टम फ्रेमवर्क का उपयोग नहीं कर सकते हैं, ताकि निर्भरताओं को स्थैतिक पुस्तकालयों के रूप में बनाया जाना चाहिए और मुझे हेडर खोज पथों में समस्याएं मिलती हैं। जबकि फ्रेमवर्क उनके हेडर को फ्रेमवर्क बंडल के अंदर रखते हैं, स्थिर पुस्तकालयों में विकल्प नहीं होता है। मुझे आयात करने वाली प्रत्येक लाइब्रेरी के लिए व्यक्तिगत रूप से उपयोगकर्ता शीर्षलेख खोज पथ सेट अप करने से नफरत है। आदर्श रूप में मैं निर्भरता प्रोजेक्ट को वर्कस्पेस पर खींचना चाहता हूं, लाइब्रेरी को मुख्य लक्ष्य में जोड़ना और आगे की सेटिंग्स के बिना बनाना। क्या यह वर्कफ़्लो समर्थित है?

उत्तर

5

मेरे पास वर्तमान में सबसे अच्छा समाधान सभी सहायक पुस्तकालयों को एक सामान्य फ़ोल्डर में रखना है (Support कहें), Support/** पर हेडर खोज पथ सेट करना। बेकार लगता है, लेकिन काम करता है।

+0

मैं अब दिनों के लिए एक सुरुचिपूर्ण समाधान खोजने की कोशिश कर रहा हूं। आपका सबसे अच्छा अब तक मिला है। – Bastek

+1

@zoul क्या आप विस्तार कर सकते हैं? मैंने जो ट्यूटोरियल देखा है, वे सब प्रक्रिया को समझाने से कम हो जाते हैं। मैंने जो किया है वह 1 है) एक स्थिर कोको स्पर्श lib बनाएँ, 2) क्लाइंट प्रोजेक्ट में 'निर्भरता' समूह में xcodeproj फ़ाइल को खींचें और छोड़ें, 3) इसे लक्षित निर्भरता और लिंक बाइनरी में जोड़ें, और 4) कोशिश करें हेडर खोज पथ सेट करें ... और इस अंतिम चरण के काम को करने का कोई तरीका नहीं है :( – entonio

+0

@entonio, [यहां एक अच्छा ट्यूटोरियल है] (http://blog.carbonfive.com/2011/04/04/using- ओपन-सोर्स-स्टेटिक-लाइब्रेरीज़-इन-एक्सकोड -4/# add_the_static_librarys_headers) जिन्हें आपने अभी तक नहीं पढ़ा है। इसमें हेडर पथ सेट करने को भी शामिल किया गया है, उम्मीद है कि यह प्रकाशित होने के दो साल बाद भी अद्यतित है। – zoul

1

मुझे लगा कि मैं स्थाई लाइब्रेरी हेडर को Headers फ़ोल्डर में कॉपी करने के लिए सेट कर सकता हूं (डिफ़ॉल्ट /usr/local/include के बजाय)। यह फ़ोल्डर बिल्ड-उत्पाद फ़ोल्डर में दिखाई देगा और मैं उपयोगकर्ता शीर्षलेख खोज पथ से $(BUILT_PRODUCTS_DIR) और रिकर्सिव सेट कर सकता हूं।

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

+1

दुर्भाग्यवश, यह वर्तमान एक्सकोड के साथ विश्वसनीय रूप से काम नहीं करता है, संग्रह निर्माण किसी कारण से विफल रहता है। मैं एक बेहतर समाधान का स्वागत करेंगे। – zoul

3

मैं जो करता हूं वह जटिल है, लेकिन यह मेरे लिए अच्छा काम करता है।

स्थिर पुस्तकालय प्रोजेक्ट की सेटिंग्स में, "पैकेजिंग" अनुभाग में, मैंने "रैपर एक्सटेंशन" को "फ्रेमवर्क" पर सेट किया है। मैं तो बदलने के लिए:

"Public Headers Folder Path" to "$(PRODUCT_NAME).$(WRAPPER_EXTENSION)/Headers" 

और

"Private Headers Folder Path" to $(PRODUCT_NAME).$(WRAPPER_EXTENSION)/PrivateHeaders 

निर्माण उत्पादों में अंतिम परिणाम "MyLibraryName.framework" हिम्मत नाम का एक फ़ोल्डर जिनमें से वैसे ही जैसे ... अच्छी तरह से .. एक फ्रेमवर्क देखो है ।

#include <MyLibraryName/blah.h> 

नकारात्मक पक्ष यह है कि ("zoul" से जवाब में पता चला के रूप में) "संग्रह" आदेश ठीक से काम नहीं करता है: एक बात मैं इस बारे में पसंद मैं उपयोग कर सकते हैं फ्रेमवर्क शैली मेरी कोड में शामिल है । कारण यह काम नहीं करता है क्योंकि पुरालेख कमांड अंतिम निर्माण उत्पादों और लक्ष्य निर्माण उत्पादों को अलग निर्देशिकाओं में अलग करता है। एक सामान्य "निर्माण" ऐसा नहीं करता है। जब आप सिस्टम को संग्रहित करते हैं तो अंतिम निर्माण उत्पादों निर्देशिका में स्थैतिक पुस्तकालय शीर्षलेख ढूंढने की कोशिश करता है और उन्हें नहीं मिल सकता क्योंकि सिस्टम उन्हें स्थिर पुस्तकालय के लिए लक्ष्य निर्माण निर्देशिका में डालता है।

यदि आप इसके बारे में सोचते हैं, तो एक्सकोड सोचता है कि आपकी स्थिर लाइब्रेरी के लक्ष्य में एक "उत्पाद" है। वह उत्पाद "libMyLibraryName.a" है। लेकिन वास्तव में लक्ष्य के दो उत्पाद हैं ... एक पुस्तकालय है, और दूसरा पुस्तकालय के लिए शीर्षकों का सेट है। आर्काइव कमांड के साथ समस्या यह है कि लाइब्रेरी को बिल्ड उत्पाद के रूप में कॉपी किया गया है, लेकिन हेडर नहीं हैं। जब आप संग्रह चलाने की कोशिश करते हैं तो आप "शीर्षलेख नहीं मिला" के साथ समाप्त होते हैं।

इसे ठीक करने के लिए, मैं जो करता हूं वह रन स्क्रिप्ट बिल्ड चरण का उपयोग करता है।स्क्रिप्ट इस (रूबी में लिखा) की तरह दिखता है:

if ENV["TARGET_BUILD_DIR"] != ENV["BUILT_PRODUCTS_DIR"] then 
    $product_name = ENV['PRODUCT_NAME'] 
    $wrapper_extension = ENV['WRAPPER_EXTENSION'] 
    $target_build_dir = ENV['TARGET_BUILD_DIR'] 
    $built_products_dir = ENV['BUILT_PRODUCTS_DIR'] 

    $source_file = File.join($target_build_dir, $product_name + "." + $wrapper_extension) 
    $dest_file = File.join($built_products_dir, $product_name + "." + $wrapper_extension) 

    system "ln -s #{$source_file} #{$dest_file}" if File.exist?($source_file) 
end 

तो अगर लक्ष्य का निर्माण निर्देशिका और निर्मित उत्पादों निर्देशिका से मेल नहीं खाते ... नकली "की रूपरेखा" के लिए एक प्रतीकात्मक लिंक बनाने के मेरे द्वारा बनाए गए निर्मित उत्पादों में डीआईआर।

जैसा कि मैंने कहा, यह एक जटिल योजना है लेकिन यह काम करता है और मुझे फ्रेमवर्क-शैली का उपयोग करने देता है जिसमें मुझे पसंद है। पूरी गड़बड़ी बहुत सरल हो जाएगी यदि एक्सकोड आईओएस डेवलपर्स को फ्रेमवर्क बनाने देगा (जिसका अर्थ यह भी होगा कि आईओएस डेवलपर्स को डायनामिक लाइब्रेरीज़ बनाने देगा, ऐप्पल कुछ करने में अनिच्छुक है) या यदि ऐप्पल फ्रेमवर्क का एक संस्करण बनायेगा ... एक पैकेज जिसमें एक स्थिर लाइब्रेरी और हेडर जो इसके साथ जाते हैं (एक static_framework?) ताकि आपके पास एक बिल्ड उत्पाद हो जिसमें हेडर और स्थिर लाइब्रेरी दोनों हों।