2013-07-04 3 views
11

में बाहरी सी ++ हेडर का उपयोग मेरे आईओएस प्रोजेक्ट में मुझे सी ++ में लिखी गई बाहरी पुस्तकालय का उपयोग करने की आवश्यकता है। सी ++ हेडर फाइलें सभी एक निर्देशिका में हैं।उद्देश्य-सी

मैंने इन सी ++ हेडर को अपने एक्सकोड प्रोजेक्ट में जोड़ा है, और हेडर सर्च पथ (बिल्ड सेटिंग्स में) भी निर्दिष्ट किया है।

मुद्दा यह है कि इन सी ++ शीर्षकों में <> कोण ब्रैकेट का उपयोग करके एक दूसरे को शामिल किया गया है। इसके परिणामस्वरूप:

'filename.h' file not found with <angled> include, use "quotes" instead. 

अजीब बात यह है कि एक्सकोड सभी शीर्षकों के बारे में शिकायत नहीं करता है। एक ही शीर्षलेख # एक फ़ाइल में शामिल किया गया है ठीक है, जबकि एक समस्या जब # किसी अन्य में शामिल है। मुझे लगता है कि यह इस तथ्य के कारण होता है कि ये शीर्षलेख # एक-दूसरे को शामिल करते हैं।

  1. क्यों नहीं खोज पथ काम करता है?
  2. क्या इन शीर्षलेख फ़ाइलों को संशोधित किए बिना इसे हल करने का कोई तरीका है?

धन्यवाद!

+0

क्या आपके पास उस सी ++ लाइब्रेरी के स्रोत और एक्सकोड प्रोजेक्ट हैं? – CouchDeveloper

+0

@Couch डेवलपर नहीं मैं नहीं करता। –

+4

क्या "हमेशा खोज उपयोगकर्ता पथ" सेटिंग सेटिंग सेट करना सेटिंग सेट करता है? –

उत्तर

26
#include <bla.h> 

मानक पुस्तकालय या ढांचा हेडर के लिए है, और खोज रणनीति के लिए

#include "bla.h" 

इस्तेमाल किया उदाहरण

के लिए देखें कि व्यवस्था से अलग है एक कामकाज के रूप में, आप टी सेट कर सकते हैं वह एक्सकोड बिल्डिंग सेटिंग "हमेशा उपयोगकर्ता पथ खोजें" हाँ।

+1

ध्यान दें कि "हमेशा खोज पथ पथ" को YES में सेट करने से हेडर समस्याएं हो सकती हैं। इसे दृढ़ता से अनुशंसा करने की अनुशंसा की जाती है, और यह सही तरीका है। पिछली संगतता के लिए यह अभी भी वहां है। तीसरे पक्ष के लाइब्रेरी के हेडर को कोण ब्रैकेट के माध्यम से शामिल किया जाना चाहिए। – CouchDeveloper

+0

@Couch डेवलपर: यह एक कामकाज के रूप में था, लेकिन आप सही हैं और आपका जवाब संभवतः बेहतर समाधान है। –

+0

@CouchDeveloper सहमत हैं कि यह सेटिंग NO पर सेट की जानी चाहिए, लेकिन क्या यह सेटिंग किसी एम्बेडेड फ्रेमवर्क के संदर्भ में YES को इस सेटिंग को सेट करने के लिए अवांछनीय है? –

11

एक "रिक्त" आवेदन परियोजना से शुरू:

  1. एक फ़ोल्डर "पुस्तकालय" अपने आवेदन की परियोजना में बनाएं - अपने MyApp.xcodeproj फाइल करने के लिए एक भाई के रूप में बेहतर है, लेकिन यह कहीं भी हो सकता है। प्रत्येक कॉन्फ़िगरेशन (डीबग, रिलीज इत्यादि) के लिए सबफ़ोल्डर बनाएं और संभवतः प्रत्येक आर्किटेक्चर (armv7, armv7s, arm64) के लिए बाइनरी सार्वभौमिक बाइनरी संग्रह है जिसमें सभी आर्किटेक्चर शामिल हैं।

  2. तृतीय पक्ष लाइब्रेरी और स्थिर लाइब्रेरी बाइनरी (संभवतः विभिन्न प्लेटफ़ॉर्म, कॉन्फ़िगरेशन और आर्किटेक्चर के लिए एक से अधिक) के शीर्षलेख प्राप्त करें और उन्हें "लाइब्रेरी" फ़ोल्डर में संबंधित उपफोल्डर्स में ले जाएं (जिसे आपको बनाने की आवश्यकता हो सकती है):

    उदाहरण के लिए, यह सोचते हैं आप एक सार्वभौमिक द्विआधारी (ARMv7, armv7s, arm64) और डीबग था और है कि पुस्तकालय के संस्करणों का परित्याग: अब, फ़ोल्डर संरचना माना जाता है इस प्रकार है:

    $(SRCROOT)/Libraries 
        Debug-iphoneos 
         include 
          ThirdParty 
           third_party.hh 
           ... 
         libThirdParty.a    
        Release-iphoneos 
         include 
          ThirdParty 
           third_party.hh 
           ... 
         libThirdParty.a    
    MyApp.xcodeproj    
    
  3. "लाइब्रेरी खोज पथ" बिल्ड से टिंग:

    अपने एक्सकोड प्रोजेक्ट में "पुस्तकालय" फ़ोल्डर खींचें। यह बिल्ड सेटिंग्स में स्वचालित रूप से एक लाइब्रेरी खोज पथ बना सकता है। कृपया इसे सत्यापित करें, और यदि यह सही नहीं है, तो इसे ठीक करें।

    उदाहरण को देखते हुए, डीबग निम्नलिखित पुस्तकालय खोज पथ को जोड़ने और विन्यास का परित्याग:

    डीबग: लाइब्रेरी खोज पथ: $(SRCROOT)/Libraries/Debug-iphoneos

    रिलीज: लाइब्रेरी खोज पथ: $(SRCROOT)/Libraries/Release-iphoneos

    विशेष कॉन्फ़िगरेशन और लक्ष्य प्लेटफ़ॉर्म जोड़े के लिए आपके पास अलग-अलग लाइब्रेरी खोज पथ हो सकते हैं। तदनुसार निर्माण सेटिंग में अलग-अलग पथ सेट करें।

  4. "हैडर खोजें पथ" बिल्ड स्थापना:

    उदाहरण को देखते हुए, डीबग और रिलीज विन्यास के लिए निम्न हैडर खोज पथ जोड़ें:

    डीबग: हैडर खोजें पथ: $(SRCROOT)/Libraries/Debug-iphoneos/include

    रिलीज: हैडर खोजें पथ: $(SRCROOT)/Libraries/Release-iphoneos/include

    इसी तरह, आपके पास विशेष रूप से कॉन्फ़िगर/लक्ष्य जोड़े के लिए अलग-अलग पथ हो सकते हैं - हालांकि शीर्षलेख समान हो सकते हैं।

  5. अन्य लिंकर झंडे निर्माण सेटिंग को -lc++ जोड़कर सी ++ मानक पुस्तकालय के खिलाफ अपने एप्लिकेशन लिंक।

  6. आयात आपकी फ़ाइलों में शीर्ष लेख इस प्रकार है:

    #import <ThirdParty/third_party.hh> 
    
+0

इससे मदद मिली, क्योंकि यह त्रुटि मेरे मामले में लक्षित-निर्भर थी। –

+0

एपिक, पहली बार जब मैं कोण को अपनी परियोजना में एक तृतीय पक्ष लाइब्रेरी के साथ काम कर सकता हूं क्योंकि मैं इसे पैच करना चाहता हूं। धन्यवाद। – aledalgrande

1

अपनी लाइब्रेरी की निर्देशिका को इंगित करने के लिए "उपयोगकर्ता हैडर खोजें पथ" सेट करने के बाद XCode में, आप यह भी सुनिश्चित करना है कि एक , < बढ़ावा/signals2.hpp > फ़ाइल के साथ < कोणीय > शामिल नहीं मिला साथ "उद्धरण चिह्न" का उपयोग करें: क्षेत्र कहा जाता "हमेशा खोजें उपयोगकर्ता पथ" "हाँ"

यह समस्या मैं हो रही थी हल करने के लिए सेट कर दिया जाता बजाय।

1

एक्सकोड 9 में, मुझे Header Search Paths बिल्डिंग सेटिंग में हेडर फाइल पथ जोड़ने की आवश्यकता है, User Header Search Paths नहीं।

Xcode User Header Search Paths संलग्न -iquote विकल्प के रूप में आदेश को संकलित करने के लिए, लेकिन Header Search Paths-I के रूप में विकल्प जोड़ देंगे। यह महत्वपूर्ण अंतर है।

+0

इसे इंगित करने के लिए धन्यवाद। (हालांकि मुझे यह जांचने का समय नहीं था, मैं आपको भरोसा करता हूं।) –