2010-02-18 11 views
30

जीसीसी में __attribute__((weak)) के माध्यम से कमजोर रूप से प्रतीक लिंक बनाने की क्षमता है। मैं एक स्थिर पुस्तकालय में एक कमजोर प्रतीक का उपयोग करना चाहता हूं जो उपयोगकर्ता अपने आवेदन में ओवरराइड कर सकते हैं। एक जीसीसी शैली कमजोर प्रतीक मुझे ऐसा करने देगा, लेकिन मुझे नहीं पता कि यह दृश्य स्टूडियो के साथ किया जा सकता है या नहीं।विजुअल स्टूडियो में जीसीसी शैली कमजोर जुड़ाव?

क्या विजुअल स्टूडियो एक समान सुविधा प्रदान करता है?

+1

देखें [डिफ़ॉल्ट कार्यों के साथ विंडोज स्टेटिक लाइब्रेरी] (http://stackoverflow.com/questions/5097961/windows-static-library-with-default- कार्यक्षमताओं)। क्या आप यह हासिल करने की कोशिश कर रहे हैं? – brady

+0

[माइकल बुर द्वारा जवाब] देखें (http://stackoverflow.com/a/2290843/321013) - एमएसवीसी वास्तव में * इस व्यवहार के लिए * डिफ़ॉल्ट *। यदि आप किसी प्रतीक को ओवरराइड करते हैं जो पहले से ही निर्भरता lib में परिभाषित है, तो '.lib' में प्रतीक को चुपचाप अनदेखा कर दिया जाएगा। –

उत्तर

13

एमएसवीसी ++ में __declspec(selectany) है जो कमजोर प्रतीकों की कार्यक्षमता का हिस्सा शामिल करता है: यह आपको बाहरी लिंकेज के साथ कई समान प्रतीकों को परिभाषित करने की अनुमति देता है, जिससे संकलक को कई उपलब्ध विकल्पों में से किसी एक को चुनने के लिए निर्देशित किया जाता है। हालांकि, मुझे नहीं लगता कि एमएसवीसी ++ में कुछ भी है जो कमजोर प्रतीक कार्यक्षमता के दूसरे भाग को कवर करेगा: लाइब्रेरी में "प्रतिस्थापन योग्य" परिभाषाएं प्रदान करने की संभावना।

यह, बीटीडब्लू, यह आश्चर्य करता है कि मानक बदलने योग्य ::operator new और ::operator delete कार्यों के लिए समर्थन MSVC++ में कैसे काम करता है।

+0

क्या एमएसवीसी ++ में इस मैक्रो की तरह कुछ है जो 'main()' के साथ काम करता है ताकि किसी भी कोड को * इस * फ़ाइल को 'मुख्य() 'ओवरराइड कर सकें? – mcandre

+0

':: ऑपरेटर new' जहाजों को 'nothrownew.obj' के अंदर ऑब्जेक्ट कोड के रूप में। मुझे लगता है कि सीआरटी ऑब्जेक्ट कोड खींचने के लिए ['__fltused'-trick] (http://blogs.msdn.com/b/oldnewthing/archive/2013/01/08/10383017.aspx) पर एक समान अवधारणा का उपयोग करता है मॉड्यूल में जब तक इसे कहीं और परिभाषित नहीं किया गया है। ओबीजे और एलआईबी के लिए शास्त्रीय लिंकर नियमों का वर्णन [द ओल्ड न्यू थिंग] (http://blogs.msdn.com/b/oldnewthing/archive/2013/01/09/10383325.aspx) में किया गया है। – IInspectable

0

ऐसा करने का एक तरीका इसे मैन्युअल रूप से LoadLibrary और GetProcAddress के माध्यम से कार्यान्वित करना होगा।

+0

बुरा और बॉयलरप्लेट के बहुत सारे ... श्वास सी ++: पी –

+1

दरअसल। यह कुछ गंभीरता से बदसूरत कोड बनाता है। –

+1

कमजोर फ़ंक्शन एक स्थिर लाइब्रेरी में होगा। क्या वे काम डीएलएल के बिना काम करेंगे? –

3

इस विशेषता के बराबर एमएस-वीसी नहीं है। http://connect.microsoft.com/VisualStudio/feedback/details/505028/add-weak-function-references-for-visual-c-c देखें। मैं कुछ भयानक सुझाव देने जा रहा हूं: इसके उद्देश्य को यहां पढ़ना: http://www.kolpackov.net/pipermail/notes/2004-March/000006.html यह अनिवार्य रूप से कार्यों को परिभाषित करना है कि, यदि उनके प्रतीक मौजूद हैं, अन्यथा नहीं हैं, तो ...

क्यों पूर्व का उपयोग नहीं करें - इस उद्देश्य के लिए प्रोसेसर, "अगर आपको यह सब करने की ज़रूरत है" की विशाल चेतावनी के साथ? (मैं प्री-प्रोसेसर की सिफारिश करने का प्रशंसक नहीं हूं)।

उदाहरण:

#ifdef USE_MY_FUNCTION 
    extern void function(); 
#endif 

तो आवेदन तर्क में उचित रूप से कहते हैं, #ifdef बयानों से घिरा हुआ। यदि प्रक्रिया में जोड़ने के हिस्से के रूप में आपकी स्थाई लाइब्रेरी जुड़ी हुई है, तो यूएसE_MY_FUNCTION को परिभाषित करने के लिए परिभाषित करें।

काफी प्रत्यक्ष समकक्ष और बहुत बदसूरत नहीं है लेकिन यह सबसे अच्छा है जिसे मैं सोच सकता हूं।

7

एमएसवीसी ऐसा व्यवहार करता था कि अगर किसी प्रतीक को .obj फ़ाइल में परिभाषित किया गया है और एक .lib यह बिना किसी चेतावनी के .obj फ़ाइल पर उपयोग करेगा। मुझे याद है कि यह उस स्थिति को भी संभालेगा जहां प्रतीक कई libs में परिभाषित किया गया है, यह सूची में पहले नामित लाइब्रेरी में से एक का उपयोग करेगा।

मैं नहीं कह सकता कि मैंने थोड़ी देर में यह कोशिश की है, लेकिन अगर मैं इस व्यवहार को बदलता हूं तो मुझे आश्चर्य होगा (विशेष रूप से .obj परिभाषित प्रतीक .lib फ़ाइलों में प्रतीकों को ओवरराइड करते हैं)।

/* 
* pWeakValue MUST be an extern const variable, which will be aliased to 
* pDefaultWeakValue if no real user definition is present, thanks to the 
* alternatename directive. 
*/ 

extern const char * pWeakValue; 
extern const char * pDefaultWeakValue = NULL; 

#pragma comment(linker, "/alternatename:_pWeakValue=_pDefaultWeakValue") 
+2

वीएस 2010 आरसी के साथ एक संक्षिप्त परीक्षण इंगित करता है कि मैंने जो व्यवहार वर्णित किया है वह अभी भी वहां है। –

58

तुम कर सकते हो, यहाँ सी में एक उदाहरण है। प्रत्येक प्रतीक को एक अलग पुस्तकालय में रखें। ओवरराइड के साथ उपयोगकर्ता ऑब्जेक्ट्स को लाइब्रेरी में भी जोड़ा जाना चाहिए। फिर सभी को एक आवेदन में लिंक करें। उपयोगकर्ता लाइब्रेरी को इनपुट फ़ाइल के रूप में निर्दिष्ट किया जाना चाहिए, आपकी lib को /DEFAULTLIB: विकल्प का उपयोग करके लिंकर में स्थानांतरित किया जाना चाहिए।

+0

यह एक सही जवाब है। क्या आप इसे वापस करने के लिए कुछ दस्तावेज पा सकते हैं? –

+21

यह एक अनियंत्रित सुविधा है। Msvcrt स्रोत कोड ब्राउज़ करते समय मैंने गलती से ठोकर खाई है। – Ringo

3

एक ही रास्ता मुझे पता है:

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