2010-07-02 11 views
7

मैं (1.4-3 ver) वी.एस. 2008 में बूस्ट का एक सरल ट्यूटोरियल :: थ्रेड पालन करने के लिए कोशिश कर रहा हूँ:बढ़ावा :: धागा निर्माण त्रुटि (लिंक करने में असमर्थ lib && अनसुलझे बाह्य)

#include <boost/thread/thread.hpp> 

void Func() 
{ 
    // Do something 
} 

void main() 
{ 
    boost::thread _thrd(&Func); 
    _thrd.join(); 
    .... 
} 

के दौरान

Error 1 fatal error LNK1104: cannot open file 'libboost_thread-vc90-mt-gd-1_43.lib' CConsole 

जो मैं #define BOOST_ALL_NO_LIB जोड़कर हल करने के लिए है: संकलन यह इस त्रुटि पैदा करता है।

Error 3 fatal error LNK1120: 2 unresolved externals 
C:\xx\Documents\Visual Studio 2008\Projects\CConsole\Debug\CConsole.exe 


Error 1 error LNK2019: unresolved external symbol "public: __thiscall boost::thread::~thread(void)" ([email protected]@@[email protected]) referenced in function _wmain CConsole.obj 


Error 2 error LNK2019: unresolved external symbol "private: void __thiscall boost::thread::start_thread(void)" ([email protected]@[email protected]@AAEXXZ) referenced in function "public: __thiscall boost::thread::thread<void (__cdecl*)(void)>(void (__cdecl*)(void),struct boost::thread::dummy *)" ([email protected]@[email protected]@[email protected]@[email protected]@Z) CConsole.obj 

किसी को भी समस्या का समाधान कैसे पता है: हालांकि, यह मुझे एक और त्रुटि देता है?

धन्यवाद।

+0

बूस्ट के सभी हिस्सों में केवल हेडर ही नहीं हैं। आपको उपयुक्त सीपीपी फाइलों (अनुशंसित नहीं) या (आमतौर पर बेहतर) को एक स्थिर लाइब्रेरी बनाने की आवश्यकता है जिसमें आप अपनी परियोजना को लिंक कर सकते हैं। – stinky472

+0

हाय stinky472, मैं lib फ़ाइल को लिंक करता हूं, हालांकि मुझे लगता है कि फ़ाइल का नाम थोड़ा अंतर है, इसलिए मैं फ़ाइल का नाम बदलता हूं और ऐसा लगता है। धन्यवाद। – csa

+0

आपके द्वारा निर्मित किस प्रकार की lib के आधार पर lib परिवर्तन का नाम: स्थैतिक/गतिशील, डीबग/रिलीज, सिंगल/मल्टीथ्रेडिंग .... आपको नाम बदलना नहीं चाहिए, लेकिन सही lib का निर्माण करना चाहिए जिसे आपको पैरामीटर का उपयोग करने की आवश्यकता है bjam निर्माता। – nabulke

उत्तर

0

आपको बूस्ट थ्रेड लाइब्रेरी बनाने और दृश्य स्टूडियो को कहने की आवश्यकता है जहां लाइब्रेरी है। यह सब प्रारंभ करने वाले दस्तावेज़ों में प्रलेखित है (यानी Getting Started on Windows)। विशेष रूप से section 5 और फिर section 6 पढ़ें।

पीएस। आपको यह सुनिश्चित करने की ज़रूरत है कि आपके निर्माण कॉन्फ़िगरेशन से मेल खाता है जो आपके पास VS सेट है। प्रारंभ करना विभिन्न निर्माण विकल्पों को समझाता है।

21

मुझे लगता है कि "एफ * किकिंग मैनुअल पढ़ें" से गहरा जवाब उपयोगी हो सकता है!

इस प्रकार की लिंक त्रुटि एक सुराग है जिसे आप एक असंगत बूस्ट लाइब्रेरी को जोड़ने का प्रयास कर रहे हैं।

मुझे यह मिला जब मैंने गलती से 32 बिट बूस्ट थ्रेड लाइब्रेरी बनाई, जब मैंने सोचा कि मैं 64 बिट लाइब्रेरी का निर्माण कर रहा हूं। यह पता लगाने में कुछ समय लगा कि जब आप --address-model=64 को bjam कमांड लाइन पैरामीटर के रूप में कहते हैं तो आपने एक सूक्ष्म गलती की है। address-model पैरामीटर में -- उपसर्ग नहीं होना चाहिए। दुर्भाग्य से जब यह गलत वाक्यविन्यास देखता है तो bjam आपको सूचित नहीं करता है।

आप डंपिन प्रोग्राम का उपयोग अपनी लाइब्रेरी द्वारा प्रदान किए गए प्रतीकों की जांच के लिए कर सकते हैं, जो लिंकर कहते हैं कि अनसुलझे हैं। मैंने पाया कि लाइब्रेरी प्रतीकों को __thiscall से सजाया गया था और __cdecl नहीं था। यह आर्किटेक्चर मेलमिच का एक चिल्लाना अच्छा सुराग है। माइक्रोसॉफ्ट कंपाइलर 32-बिट बिल्ड के लिए __thiscall फ़ंक्शन कॉल प्रोटोकॉल का उपयोग करता है, लेकिन यह 64-बिट बिल्ड के लिए __cdecl का उपयोग करता है। हां, माइक्रोसॉफ्ट प्रलेखन यहां थोड़ा कमजोर है !!

यह देखने के लिए .lib या .dll की जांच करने का सबसे अच्छा तरीका डंपबिन प्रोग्राम का उपयोग करना है। यहां एक उदाहरण दिया गया है:

dumpbin /headers libboost_thread-vc100-mt-gd-1_45.lib | findstr machine 

आपको निश्चित रूप से लिंक करने के अनुरूप पुस्तकालय नाम समायोजित करना होगा। यह आपको स्पष्ट रूप से दिखाएगा कि .lib या .dll x86 (जो 32-बिट है) या x64 (64-बिट) के लिए लक्षित है या नहीं।

+1

मैंने सोचा कि अगर मैंने "विजुअल स्टूडियो 2005 x64 Win64 कमांड प्रॉम्प्ट" का उपयोग करके बढ़ावा दिया है तो मेरे पास 64-बिट बूस्ट लाइब्रेरी होगी। तब मैं इस तरह की लिंकिंग त्रुटियों में दौड़ रहा था। इस जवाब को खोजने में बहुत गुस्सा आया। धन्यवाद! '। \ B2 पता-मॉडल = 64 चरण' – Mark

+0

इस प्रकार की समस्याएं भी इस तथ्य से निकलती हैं कि डिफ़ॉल्ट रूप से बढ़ावा देने से सभी libs के लिए एक ही निर्देशिका का उपयोग होता है और यह आर्किटेक्चर के आधार पर फ़ाइल नाम नहीं बदलता है। इस तरह आप i64 के साथ x86 libs को आसानी से ओवरराइट कर सकते हैं और इसके विपरीत। –

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