2011-10-12 13 views
6

एक पुस्तकालय डेवलपर के रूप में, मैं अपने पुस्तकालय उपयोगकर्ताओं (विंडोज, MSVC) गलत विन्यास को जोड़ने से रोकना चाहते हैं।रोकें मिश्रण डिबग और रिहाई पुस्तकालयों

क्या उपयोगकर्ता को संकलन समय के दौरान चेतावनी देना संभव है कि उसे पुस्तकालय की सही कॉन्फ़िगरेशन से लिंक करना चाहिए?

संपादित

दोनों डिबग और जारी संस्करणों के लिए Windows डेवलपर उनके एप्लिकेशन डिबग करने के लिए अनुमति देने के लिए उपलब्ध होना चाहिए। तो मेरी लाइब्रेरी के डीबग और रिलीज संस्करण दोनों उपलब्ध होना चाहिए।

मैं क्योंकि Windows शुरुआत डेवलपर्स के लिए समर्थन की बहुत उन्हें के कारण होता है इस सवाल पूछ रहा हूँ मिश्रण डिबग और जारी कोड, और कठिन डिबग क्रम त्रुटियों हो रही।

+0

आप अपने क्लाइंट को अपनी लाइब्रेरी डीबग क्यों करना चाहते हैं? क्या आप इसके साथ स्रोत कोड की आपूर्ति कर रहे हैं? अपने एपीआई को डिजाइन करें ताकि संकलक सेटिंग्स कोई फर्क नहीं पड़ता। COM एबीआई एक अच्छा उदाहरण है। –

+0

यदि आप किसी डीएल के बजाय स्थिर lib बनाते हैं तो आपको किसी भी तरह से डीबग संस्करण जोड़ना होगा। अन्यथा कोई भी डीबग संस्करण बनाने में सक्षम नहीं है। – Totonga

उत्तर

0

आप # चेतावनी निर्देश जोड़ सकते हैं लेकिन मैं आपको इसे करने के लिए दृढ़ता से हतोत्साहित करता हूं। आपको दो अलग-अलग नामों के साथ अपनी लाइब्रेरी के विभिन्न संस्करणों को बेहतर ढंग से वितरित करना चाहिए।

myLib.h // Release Version 
myLibd.h // Debug Version 

ऐसा कर रहा है, यह ध्यान रखना, जब वे अपने पुस्तकालय के साथ आवेदन स्थापित करेगा (के बाद से स्थापित करने के मैनुअल होना चाहिए) उपयोगकर्ता के लिए बाध्य करेगा:

यहाँ अपनी समस्या के लिए एक और संकेत है ।

तुम भी README में एक नोट जोड़ने के लिए या स्थापित कर सकते हैं, उपयोगकर्ता के सबसे इसे पढ़ा जब वे MSVC पर जोड़ने की स्थापना करना चाहते हैं।

आप अपने कार्यक्रम में DEBUG और NDEBUG मैक्रो मान भी देख सकते हैं। (आपकी लाइब्रेरी प्रारंभिकरण के दौरान एक जोर के साथ।

4

अच्छा सवाल, मैंने हमेशा यह माना है कि मेरे पुस्तकालयों का उपयोग करने वाले डेवलपर्स सही संस्करण से लिंक होंगे। अब जब मैं इसके बारे में सोचता हूं, तो आप अपनी डीबग लाइब्रेरी क्यों जारी करना चाहेंगे ?

//header: 
class DLLIMPEXP Dummy 
{ 
    static int x; 
    virtual void dummy(); 
} 
//cpp 
#ifdef DEBUG 
int Dummy::x = 0; 
void Dummy::dummy() 
{ 
} 
#endif 

आप कर सकते हैं के रूप में: जनता के लिए क्यों दोनों अपने डिबग नहीं करना चाहिए और जारी संस्करणों विन्यास प्रति कुछ प्रतीकों के निर्यात से भले ही अपने रिलीज पुस्तकालय के खिलाफ लिंक

, मैं ऐसा करने का एक तरीका है देखते हैं? देखें, आपका प्रतीक केवल तभी निर्यात किया जाएगा जब आपका मॉड्यूल DEBUG में संकलित किया गया हो। रिलीज़ एम में lib के खिलाफ लिंक करने का प्रयास कर रहा है एक तीसरे मॉड्यूल से ode परिणामस्वरूप एक लिंकर त्रुटि होगी। आप रिवर्स केस के लिए कुछ समान हो सकते हैं।

मुझे सुझाव नहीं है कि आप ऐसा करते हैं, हालांकि मैं इसे दस्तावेज करता हूं या केवल मेरे मॉड्यूल के रिलीज़ संस्करण को वितरित करता हूं।

+0

काफी दिलचस्प है। आपको एक विचार आया: गैर रेखांकित फ़ंक्शन IsReleaseVersion() जो लाइब्रेरी में होगा। और इसके संस्करण की जांच के लिए कन्स्ट्रक्टर इनलाइन चेक (जिसे एप्लिकेशन साइड में शामिल किया जाएगा) में जोड़ें। – Phong

+0

मैंने अभी आपके कुछ जवाब देने के लिए प्रश्न संपादित किया है। यह केवल एक लिंक त्रुटि ट्रिगर करेगा जब उपयोगकर्ता उस प्रतीक का उपयोग अपने कोड में करने का प्रयास करता है। इसके अलावा, मैं चाहता हूं कि उपयोगकर्ता उन्हें एक स्पष्ट संदेश प्राप्त करें कि "आप सही पुस्तकालय से लिंक नहीं कर रहे हैं"। – Mourad

+0

@Mourad: आप लापता प्रतीक का नाम कृपया उपयोग कर सकते हैं कृपया उपयोग करें UURRleaseVersionOfXxxLibrary, इसी तरह कृपयाUUDDebugVersionOfXxxLibrary। –

1

यहां दो अलग-अलग पहलू हैं:

  • असंगति मुद्दा
  • प्रदर्शन मुद्दा

यदि यह प्रदर्शन की बात है, तो विकल्प अभी भी उनकी होना चाहिए, वे करने के लिए इच्छा हो सकती है डिबग।

यदि यह असंगति की बात है, एक साधारण बात डिबग संस्करण के लिए नाम स्थान बदलना चाहते हैं, तो यह है कि प्रतीकों को अलग ढंग से घायल हो रहा है।

#ifdef NDEBUG 
    namespace project { 
#else 
    namespace project { namespace debug { 
#endif 

// content 

#ifdef NDEBUG 
    } 
#else 
    } 
    using namespace debug; 
    } 
#endif 

एक debug नाम स्थान में घोंसला बनने करके, आप प्रतीकों में से mangling बदल (हालांकि, संकलन के लिहाज से, यह कुछ भी नहीं बदलता है)। यह वास्तव में को को रिलीज़ संस्करण के साथ डीबग संस्करण के विरुद्ध संकलित एक लाइब्रेरी को अवरुद्ध करता है (और इस प्रकार रहस्यमय तरीके से दुर्घटनाग्रस्त होने के बजाय असंगतता को हल करता है)।

हालांकि, मैं आपको कक्षाओं के एक बहुत ही विशिष्ट समूह (यह भारी) में आरक्षित करने का आग्रह करता हूं।

डीबग और रिलीज मोड दोनों में संगत इंटरफेस प्रदान करने में सक्षम होना संभव है, ताकि ग्राहक लोड समय पर हॉट-स्वैप कर सकें।

0

विभिन्न प्रकार

#ifndef _DLL 
// C runtime as dll 
# ifdef _DEBUG 
# pragma comment(lib, "MyLibD.lib") 
# else 
# pragma comment(lib, "MyLib.lib") 
# endif 
#else 
// C runtime statically 
# ifdef _DEBUG 
# pragma comment(lib, "MyLibSD.lib") 
# else 
# pragma comment(lib, "MyLibS.lib") 
# endif 
#endif 

विभिन्न प्रकार

#ifndef _DLL 
// C runtime as dll 
# ifdef _DEBUG 
# pragma comment(lib, "debug/dynamic/MyLib.lib") 
# else 
# pragma comment(lib, "release/dynamic/MyLib.lib") 
# endif 
#else 
// C runtime statically 
# ifdef _DEBUG 
# pragma comment(lib, "debug/static/MyLib.lib") 
# else 
# pragma comment(lib, "debug/static/MyLib.lib") 
# endif 
#endif 

के लिए अलग पथ के लिए अपने lib के शीर्षक के लिए इस कोड को जोड़े

विभिन्न नाम बाद में आप केवल करने के लिए है अपने लिंकर को lib में पथ जोड़ें और अब आप अब नहीं हैं इसे मिश्रण करने के लिए ले।

+1

इसे आम तौर पर अच्छा अभ्यास नहीं माना जाता है (कोड में पुस्तकालय निर्दिष्ट करना), लेकिन यह एक समाधान है इसलिए मैं डाउनवोट नहीं करूंगा । –

+0

यदि आप एक स्थिर lib विकसित करते हैं और एक डीएल नहीं तो मैं हमेशा इसे पसंद करूंगा। इतने सारे फायदे हैं और त्रुटियों से बचा है कि मैं दार्शनिक कारणों की परवाह नहीं करता। – Totonga

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