2009-07-13 17 views
6

मैं ओपनसीवी के साथ काम कर रहा हूं और मैं पूरी लाइब्रेरी को अपने नामस्थान के अंदर रखना चाहता हूं। मैंने काफी कुछ देखा है लेकिन मुझे कोई जवाब नहीं मिला है ...क्या आप एक नामस्थान के अंदर एक पुस्तकालय डाल सकते हैं?

क्या आप लाइब्रेरी स्रोत कोड को संशोधित किए बिना ऐसा कर सकते हैं? तो फिर कैसे?

+0

मैंने अभी ओपनसीवी वेबसाइट देखी है। ऐसा लगता है कि सभी कार्यों को "सीवी" के साथ उपसर्ग किया गया है। जबकि नामस्थान एक बेहतर समाधान हैं, मुझे आश्चर्य है, क्या आपके पास वास्तविक प्रतीक टकराव हैं? –

+0

मेरे पास वास्तविक टकराव नहीं हैं, यह केवल चीजों को व्यवस्थित रखने के लिए है क्योंकि मैं कुछ ओपनसीवी डेटा संरचनाओं के रैपर कर रहा हूं और उन्हें उसी नामस्थान में रखना चाहता हूं। –

उत्तर

7

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

+0

अरे यह ........ –

+0

स्वीकृत क्योंकि यह सीधे –

+0

बिंदु और सबसे बुद्धिमान सलाह थी, निश्चित रूप से? –

4

आप सिद्धांत रूप में एक प्रोग्राम लिख सकते हैं जो पुस्तकालय के प्रतीक निर्यात तालिकाओं को पार्स करेगा, और वहां प्रतीकों के नामों को बदल देगा। आपको अभी भी शीर्षलेखों को बदलने की आवश्यकता होगी।

ने कहा कि नामस्थान टैग जोड़ने और लाइब्रेरी को पुन: संकलित करने के लिए एक साधारण स्क्रिप्ट लिखना बहुत आसान होगा।

+8

मैंने एक बार तीसरे पक्ष की लाइब्रेरी में बदसूरत नाम संघर्ष के आसपास काम करने के लिए किया है। मेरी मजबूत सलाह है: ** ** नहीं! यह भयानक है। –

+0

धन्यवाद सलाह से Konrad! –

+0

या आप केवल ओब्जॉपी का उपयोग कर सकते हैं जिसमें प्रतीकों को बदलने की क्षमता है: -पी। –

2

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

कुछ लाइब्रेरी की लिंकर निर्भरताओं को छिपाने के लिए COM के साथ ऐसा करना बहुत आम था। नहीं देख सकता कि आप इसे C++ के साथ क्यों नहीं कर सकते हैं।

3

सामान्य उत्तर यह है कि आप नहीं कर सकते हैं, लेकिन कुछ चालें आप कर सकते हैं।

उदाहरण के लिए, objcopybinutils से एक वस्तु उपसर्ग-प्रतीकों ध्वज का उपयोग करके हर प्रतीक पर एक उपसर्ग कॉपी, लेकिन डाल करने की क्षमता है। चीजों को उपसर्ग करना अक्सर गरीब व्यक्ति के नामस्थान होता है और संघर्ष से बचने का एक "ठीक" तरीका है।

प्रयोग बहुत सरल, कुछ इस तरह है:

objcopy --prefix-symbols "__mylib_" object.o new_object.o 

नोट: हाँ, यह .so भी फाइलों के साथ काम करता है।

नोट 2: यह पूरी तरह से C++ नाम मैंगलिंग को तोड़ देगा, इसलिए केवल सी शैली एपीआई के साथ लाइब्रेरी पर इसका प्रयास करें। चूंकि आप नामस्थान जोड़ने के बारे में बात कर रहे हैं, जहां कोई नहीं है, मुझे लगता है कि यह मामला है।

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