2011-08-08 9 views
11

मुझे लिंक चरण पर चेतावनियां हैं। ये चेतावनियां केवल रिलीज मोड में दिखाई देती हैं।चेतावनियों को कैसे हटाएं LNK4217 और LNK4049

मेरा प्रोग्राम दो भागों से बना है: एक पुस्तकालय जो .lib उत्पन्न करता है और एक निष्पादन योग्य जो इस लाइब्रेरी का उपयोग करता है।

जब मैं पुस्तकालय बनाता हूं तो मुझे कोई चेतावनी नहीं है। लेकिन जब मैं अपना निष्पादन योग्य बनाता हूं, लिंक पर मुझे एलएनके 4217 और एलएनके 4049 चेतावनियां हैं। उदाहरण के लिए:

3>DaemonCommon.lib(Exception.obj) : warning LNK4217: locally defined symbol [email protected]@@[email protected]@Z (public: __thiscall std::exception::exception(char const * const &)) imported in function "public: __thiscall std::bad_alloc::bad_alloc(char const *)" ([email protected]@@[email protected]@Z) 
3>DaemonCommon.lib(CommAnetoException.obj) : warning LNK4217: locally defined symbol [email protected]@@QAE[email protected]@Z (public: __thiscall std::exception::exception(char const * const &)) imported in function "public: __thiscall std::bad_alloc::bad_alloc(char const *)" ([email protected]@@[email protected]@Z) 

मैं MSDN में पढ़ा है, इन चेतावनियों __declspec (dllimport) की घोषणा की वजह से हो सकता है। लेकिन, मेरे मुक्ति के मेरे वर्गों में, मैंने इस तरह की चीजों को घोषित नहीं किया है।

#ifndef _EXCEPTION_HPP__ 
#define _EXCEPTION_HPP__ 

#include <string> 

namespace Exception 
{ 
    class Exception 
    { 
    public: 
     // Constructor by default 
     Exception(); 

     // Constructor parametrized 
     Exception(std::string& strMessage); 

     // Get the message of the exception 
     virtual std::string getMessage() const; 

     // Destructor 
     virtual ~Exception(); 

    protected: 

     // String containing the message of the exception 
     std::string mStrMessage; 
    }; 
} 

#endif 

किसी मुझे बता सकते हैं क्यों इन चेतावनियों दिखाई देते हैं और उन्हें कैसे नष्ट करने के लिए: उदाहरण के लिए, यहाँ मेरी कक्षा अपवाद है?

उत्तर

17

यह __declspec(import)के कारण "आयातित", यानी "के रूप में वर्णित प्रतीकों पर होता है। public: __thiscall std::exception::exception(char const * const &) पर। यह रनटाइम चयन (/MT (स्थिर बहु-थ्रेडेड रनटाइम) v.s. /MD (गतिशील रनटाइम) के लिए कंपाइलर विकल्प के बीच मेल नहीं खा सकता है और प्रीप्रोसेसर विकल्प (_DLL परिभाषित)। विशेष रूप से उन चेतावनियां दिखाई देंगी यदि आप /MT (या /MTd डीबग कॉन्फ़िगरेशन में संकलित) के साथ संकलित करते हैं, लेकिन _DLL किसी भी तरह परिभाषित किया गया है।

तो सुनिश्चित करें कि आप _DLL को परिभाषित नहीं कर रहे हैं जब /MD के साथ संकलित नहीं हो रहा है।

निष्पादन योग्य के समान रनटाइम के लिए सभी पुस्तकालयों को संकलित करना भी महत्वपूर्ण है, इसलिए जांच करें कि रनटाइम चयन सभी परियोजनाओं के लिए मेल खाता है और आप किसी भी तृतीय-पक्ष पुस्तकालयों के उचित संस्करण को जोड़ रहे हैं।

+2

वास्तव में, ऐसा इसलिए था क्योंकि मेरी निष्पादन योग्य परियोजना को "बहु थ्रेडेड \ एमटी" के बजाय "बहु थ्रेडेड डीएलएल \ एमडी" पर परिभाषित किया गया था ... मुझे नहीं पता क्यों। .. इसलिए आपका धन्यवाद ;-) – Cedekasme

0

यह ओपी के मुद्दे से प्रासंगिक नहीं है, लेकिन मैंने स्थानीय पुस्तकालय में निष्पादन योग्य में लिंक करते समय एलएनके 4217 को भी देखा है, जहां कोई रनटाइम लाइब्रेरी मेल नहीं है।

कुछ पुस्तकालयों को स्थैतिक के रूप में निर्माण करते समय प्रीप्रोसेसर परिभाषा की आवश्यकता होती है (भले ही स्थिर या गतिशील रनटाइम का उपयोग किया जाए)। उदाहरण के लिए, libzmq (0MQ) को स्थिर लाइब्रेरी बनाने के दौरान ZMQ_STATIC को परिभाषित करने की आवश्यकता होती है। अन्यथा, जब आप अपनी लाइब्रेरी को निष्पादन योग्य में जोड़ते हैं तो आपको LN2417 मिल जाएगा।

1

__declspec (dllexport)/__ declspec (dllimport) का मेलसमूह हेडर-परिभाषित कार्यों/वर्गों के कारण भी हो सकता है; उदाहरण के लिए: आप एक साझा लाइब्रेरी (.dll) बना रहे हैं जो शीर्षलेख-परिभाषित/"केवल" फ़ंक्शंस/कक्षाओं और लिंक किए गए फ़ंक्शंस/क्लास के मिश्रण का उपयोग करता है (एक विशिष्ट इंटरफ़ेस फ़ाइल के बिना इन्हें संकलन करते समय __declspec (dllexport) का उपयोग करने की आवश्यकता होती है इसका उपयोग करते समय साझा lib और __declspec (dllimport))। एक सामान्य त्रुटि उन हिस्सों के लिए __declspec (dllexport)/__ declspec (dllimport) को परिभाषित कर रही है जो वास्तव में केवल हेडर हैं और इस प्रकार संकलित lib का हिस्सा नहीं हैं।

0

कुछ info Russ Keldorph से क्या declspec (dllimport) वास्तव में करता है। (/QSimplicit-import- स्विच का उपयोग करके सुझाव देता है।)

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