2008-09-23 9 views
10

मैं एक ही समय में एक परियोजना में संकलित बूस्ट के दो संस्करण के लिए देख रहा हूँ। आदर्श रूप में वे इन पंक्तियों के साथ प्रयोग करने योग्य होना चाहिए:मैं एक अलग नामस्थान में बूस्ट को कैसे लपेट सकता हूं?

boost_1_36_0::boost::shared_ptr<SomeClass> someClass = new SomeClass(); 
boost_1_35_0::boost::regex expression("[0-9]", boost_1_35_0::boost::regex_constants::basic); 
+0

मुझे उत्सुकता है कि आप ऐसा क्यों करना चाहते हैं। – Ferruccio

+0

कुछ असंगतताओं के माध्यम से काम करते समय यह नए पुस्तकालय संस्करण में संक्रमण के लिए था। कुछ भी स्थायी नहीं है। – Eclipse

+0

@ ग्रहण: यदि आप अपने इंटरफेस में किसी भी बूस्ट प्रकार का खुलासा नहीं कर रहे हैं, तो आप ईएलएफ दृश्यता विशेषताओं का उपयोग कर सकते हैं, जो सार्वजनिक इंटरफ़ेस नहीं है सब कुछ छुपाएं। – wilx

उत्तर

10

मैं development list discussion के माध्यम से (अच्छी तरह से स्कैन) पढ़ें। कोई आसान समाधान नहीं है। संक्षेप में: एक नाम स्थान घोषणा

namespace boost_1_36_0 { 
    #include <boost_1_36_0/boost/regex.hpp> 
} 
namespace boost_1_35_0 { 
    #include <boost_1_35_0/boost/shared_ptr.hpp> 
} 
  • आवश्यक स्रोत फ़ाइलों
  • दोनों संस्करणों के लिए अनुमति नहीं है एक ही अनुवाद इकाई में शामिल किए जाने को संशोधित करने में

    1. रैपिंग हेडर फाइलें, इस तथ्य के कारण कि मैक्रोज़ नामस्थानों का सम्मान नहीं करते हैं।

  • हेडर से पहले बढ़ावा परिभाषित

    #define boost boost_1_36_0 
        #include <boost_1_36_0/boost/regex.hpp> 
    #undef boost 
    #define boost boost_1_35_0 
        #include <boost_1_35_0/boost/shared_ptr.hpp> 
    #undef boost 
    
    • स्रोत फ़ाइलों को आसानी से -Dboost=boost_1_36_0
    • फिर भी साथ संकलित किया जा सकता एक भी अनुवाद इकाई में मैक्रो संघर्ष का समाधान नहीं करता।
    • कुछ आंतरिक हेडर फाइल समावेशन में गड़बड़ हो सकता है, के बाद से बात की इस तरह होता है।

      #if defined(SOME_CONDITION) 
      # define HEADER <boost/some/header.hpp> 
      #else 
      # define HEADER <boost/some/other/header.hpp> 
      #endif 
      

      लेकिन यह उन मामलों के आसपास काम करना आसान हो सकता है।

  • पूरे बढ़ावा पुस्तकालय namespace boost {..}namespace boost_1_36_0 {...} साथ और फिर एक नाम स्थान उर्फ ​​उपलब्ध कराने को बदलने के लिए संशोधित करना। BOOST_1_36_0_XYZ मैक्रो के साथ सभी BOOST_XYZ मैक्रो और उनके उपयोग को बदलें।
    • यह तब होगा जब आपने प्रयास में डाल करने को तैयार थे काम करेगा।
  • +0

    होगा यदि आप हेडर को संशोधित करने जा रहे हैं, तो आप 's/BOOST_/BOOST_1_36_0_/g' जैसी किसी चीज़ के साथ मैक्रो टकराव से बचने में सक्षम हो सकते हैं। शायद। –

    +0

    मैंने आपके सुझाव को नोट करने के लिए अपडेट किया। – Eclipse

    0

    आप लिंक करने में परेशानी की एक दुनिया है क्योंकि घायल नाम अलग हो जाएगा। और हाँ, मुझे लगता है कि आप उसे जानते थे, लेकिन ऐसा लगता है कि यह चारों ओर परेशानी होगी।

    +0

    यह बात होगी। मैं सभी regex स्रोत फ़ाइलों को boostv1 निर्देशिका में नामस्थान निर्देशों के साथ भी लपेटूंगा। – Eclipse

    +0

    डैनियल के बिंदु को देखें, मैक्रोज़ हत्यारा –

    1

    @ जोश: जबकि मैं कंपकंपी से सहमत हूं, मुझे अभी भी विश्वास है कि यह कार्रवाई का बेहतर तरीका है। अन्यथा, परेशानियों को जोड़ना एक निश्चितता है। मैं जहाँ मैं objcopy का उपयोग कर परिभाषा संघर्ष से बचने के संकलित पुस्तकालयों को हैक करने के लिए किया था इससे पहले कि स्थिति मिला है। यह मंच इंटरऑपरेबिलिटी कारणों के लिए एक दुःस्वप्न था क्योंकि नाम मैंगलिंग एक ही कंपाइलर्स (मेरे मामले में, जीसीसी) के विभिन्न संस्करणों में भी बहुत अलग तरीके से काम करता है।

    4

    bcp का उपयोग करते हुए एक विशिष्ट स्थान पर बढ़ावा पुस्तकालय स्थापित कर सकते हैं और एक कस्टम उर्फ ​​करने के लिए अपने कोड में सभी 'नाम स्थान बढ़ावा' की जगह ले सकते हैं। हमारे उपनाम मानते हैं 'boost_1_36_0' सभी 'नेमस्पेस बूस्ट' कोड ब्लॉक 'boost_1_36_0' से शुरू होंगे।

    bcp --namespace=boost_1_36_0 --namespace-alias shared_ptr regex /path/to/install 
    

    की तरह कुछ है, लेकिन कड़ी में प्रलेखन जाँच अपने आप को, क्योंकि मुझे यकीन है कि नहीं कर रहा हूँ अगर यह कानूनी Syntaxis है।

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

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