2011-01-19 20 views
18

एमएस Visual C++ 2010एक आश्रित स्थिर पुस्तकालय में बूस्ट कैसे लिंक करें

में मैं अपने समाधान जो बढ़ावा इस्तेमाल किया और पूरी तरह से काम किया है में एक भी सी ++ परियोजना था।

मैंने फिर इस परियोजना को स्थैतिक पुस्तकालय में बदलने और एक नई परियोजना बनाने का निर्णय लिया जो इस स्थिर पुस्तकालय पर निर्भर करता है।

अब, मेरी परिवर्तित स्थिर लाइब्रेरी त्रुटियों और चेतावनियों (कंपाइलर और लिंकर) के बिना बनाता है लेकिन नई परियोजना संकलित करती है लेकिन लिंक नहीं करती है।

मैं हो रही है:

1>LINK : fatal error LNK1104: cannot open file 'libboost_thread-vc100-mt-1_45.lib' 

एक परीक्षण मैं इस पुस्तकालय के लिए लिंकर विकल्प के लिए पूर्ण निर्देशिका पथ जोड़ा के रूप में ... और फिर यह शिकायत की के बारे में

1>LINK : fatal error LNK1104: cannot open file 'libboost_date_time-vc100-mt-1_45.lib' 

मैं अब जोड़ लिया है सभी पुस्तकालयों के लिए पूर्ण पथ और अब यह बनाता है और चलाता है।

मैं इस समाधान के साथ खुश नहीं हूँ क्योंकि:

  1. मैं नहीं पुस्तकालय के उपयोगकर्ताओं करना चाहते बढ़ावा में जोड़ने के बारे में चिंता करने की ज़रूरत।
  2. यह गंदा

मैं जानता हूँ कि एक जवाब एक DLL बनाने के लिए होगा, लेकिन वहाँ इस स्थिर करते हैं और मेरी स्थिर पुस्तकालय स्तर पर जोड़ने रखने के लिए एक तरीका है।

संपादित करें:

अगर मैं बढ़ावा libs की अनदेखी करने के .exe लिंकर बता स्पष्ट रूप से तो यह सब ठीक है, सिवाय इसके .exe बिल्कुल बढ़ावा के बारे में चिंता करने की ज़रूरत नहीं होना चाहिए।

/NODEFAULTLIB:"libboost_thread-vc100-mt-1_45.lib" /NODEFAULTLIB:"libboost_date_time-vc100-mt-1_45.lib" 

उत्तर

24

स्पष्ट रूप से आपको .libs की आवश्यकता नहीं है, क्योंकि आपका exe उनके बिना भी लिंक करता है। आप बूस्ट हेडर-केवल विधियों और कक्षाओं का उपयोग कर रहे हैं। तो बस अपनी परियोजना में प्रीप्रोसेसर प्रतीक BOOST_ALL_NO_LIB को परिभाषित करके ऑटो लिंकिंग को अक्षम करने के लिए बढ़ावा दें।

आप को बढ़ावा देने को शामिल करके यह अनावश्यक बड़ा अपने उदारीकरण बनाना चाहते हैं, इस सवाल का एक जवाब (मैं वास्तव में अपने आप की कोशिश कभी नहीं है) धारण करने के लिए लगता है: Linking static libraries to other static libraries

+1

को बढ़ावा देने के लिए लिंक करना होगा, इस उत्तर ने मुझे एक ठीक समाधान का नेतृत्व किया। मैंने BOOST_ALL_NO_LIB को परिभाषित किया और लाइब्रेरियन में स्थिर बूस्ट लाइब्रेरी मैन्युअल रूप से जोड़ा। My.exe प्रोजेक्ट को अब बूस्ट के बारे में जानने की आवश्यकता नहीं है, जो उद्देश्य था। यह एक दयालु बात है कि स्वचालित बूस्ट लिंकिंग डिफॉल्टलिब्स के माध्यम से प्रचारित प्रतीत होता है। – T33C

+0

'बूस्ट के लिए विशेष नोट। थ्रेड' आपको 'BOOST_THREAD_USE_LIB' विकल्प का उपयोग करने की आवश्यकता हो सकती है। Http://shoddykid.blogspot.in/2008/07/getting-started-with-boost.html –

+1

मुझे एक ही समस्या है ... मैंने इसे प्रीप्रोसेसर BOOST_ALL_NO_LIB का उपयोग करके हल किया और मेरे प्रोजेक्ट में स्पष्ट रूप से डी libs को जोड़ना बूस्ट libs की निर्देशिका और लिंकर-> इनपुट-> अतिरिक्त निर्भरता के लिए केवल उपयोग की गई libs जोड़ें। डिफॉल्ट रूप से बूस्ट हेडर हेडर में libs का नाम माउंट । यह preprocessor BOOST_LIB_DIAGNOSTIC का उपयोग करने के साथ सत्यापित कर सकते हैं। –

4

अपनी लाइब्रेरी का निर्माण करते समय, आप अपने बूस्ट पुस्तकालयों को शामिल कर सकते हैं। ऐसा करने के लिए, VisualStudio के Librarian > General प्रॉपर्टी पेज में, अपने बूस्ट लाइब्रेरी को Additional Dependencies के रूप में सूचीबद्ध करें।

हालांकि, यदि आपके ग्राहक स्वयं को बढ़ावा देने का उपयोग करते हैं, और स्थिर रूप से उससे लिंक करते हैं तो समस्या हो सकती है (विशेष रूप से आप जिस व्यक्ति का उपयोग कर रहे हैं उससे भिन्न संस्करण)।

+0

हाँ, मैं यह विकल्प नहीं देखा था, लेकिन कर सकते हैं इसे काम करने के लिए मिलता है। मैंने लिंकर आउटपुट वर्बोज़ में बढ़ाया और मुझे लगता है कि .lib प्रोजेक्ट को बढ़ावा देता है .obj फ़ाइलों और .exe खोजों को बढ़ावा देता है और बूस्ट libs पाता है और फिर उनसे लिंक करने का प्रयास करता है। – T33C

+0

क्या आप वर्बोज़ बिल्ड आउटपुट पोस्ट कर सकते हैं (लाइब्रेरी का निर्माण करते समय)? बूस्ट लाइब्रेरीज़ आपकी lib कमांड लाइन पर होनी चाहिए। जैसा कि http://msdn.microsoft.com/en-us/library/e17b885t(v=VS.100).aspx पर बताया गया है, 'LIB एक लाइब्रेरी बनाता है जिसमें निर्दिष्ट फ़ाइलों में सभी ऑब्जेक्ट्स शामिल हैं।'। तो जब आपकी .exe आपकी लाइब्रेरी से लिंक हो, तो उसे किसी भी बूस्ट की आवश्यकता नहीं होनी चाहिए (जब तक कि आप अपनी लाइब्रेरी की सार्वजनिक हेडर फाइलों में बढ़ावा न दें)। –

+1

+1 धन्यवाद डैनियल, समस्या इस तरह से प्रतीत होती है कि पुस्तकालयों में बूस्ट ऑटो लिंक। उन्हें डिफॉल्टलिब्स के रूप में देखा जाता है और इन्हें रनटाइम्स के साथ प्रचारित किया जाता है। BOOST_ALL_NO_LIB को परिभाषित करना और मेरे .lib कार्यों में बूस्ट लाइब्रेरी में लिंक करना। – T33C

1

क्या आपने बूस्ट लाइब्रेरी बनाई है? बूस्ट में कुछ पुस्तकालय हैं जिन्हें संकलित करने की आवश्यकता है। अगर आपने ऐसा नहीं किया है, तो बूस्ट लाइब्रेरी बनाने के तरीके पर "Getting started in Windows" देखें।

EDIT-1: बूस्ट को स्थिर और गतिशील रूप से लोड करने योग्य (डीएलएल) पुस्तकालयों दोनों के रूप में बनाया जा सकता है।

EDIT-2: यदि आप पहले ही बूस्ट बना चुके हैं, तो @ डैनियल गेहरिगर द्वारा उत्तर आपको यह बताता है कि इसे वीएस में कैसे जोड़ना है।

+0

काम करने का वांछित तरीका नहीं है, लेकिन कृपया मेरा प्रश्न दोबारा पढ़ें। मैंने बूस्ट बनाया है और इसे ठीक से लिंक कर सकता हूं। मैं नहीं चाहता कि .exe प्रोजेक्ट को केवल .lib – T33C

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