2011-11-19 10 views
7

का उपयोग करते समय लिंकर त्रुटि जब मैं अपने सी ++ प्रोजेक्ट में क्यूटी (v4.7.4) और बूस्ट (v1.47 और v1.48) का उपयोग कर रहा हूं, तो मुझे एक क्लास के कारण एक लिंकर त्रुटि मिलती है जिसमें <boost\filesystem.hpp> शामिल है । मैंने बस क्यूटी स्थापित की और कोड बिना किसी समस्या के काम कर रहा था।क्यूटी और बूस्ट

... obj:: LNK2001 त्रुटि:

यह त्रुटि संदेश है अनसुलझे बाह्य प्रतीक "निजी: स्थिर वर्ग std :: codecvt स्थिरांक * & __cdecl को बढ़ावा देने :: filesystem3 :: पथ :: wchar_t_codecvt_facet (शून्य) "(wchar_t_codecvt_facet @ पथ @ filesystem3 @ बढ़ावा @@ CAAAPBV $ codecvt @ GDH @ एसटीडी @@ XZ)

... obj? LNK2001 त्रुटि: अनसुलझे बाह्य प्रतीक" शून्य __cdecl को बढ़ावा देने :: filesystem3 :: path_traits :: कन्वर्ट (char const *, char const *, class std :: basic_string, class std :: allocator> &, कक्षा std :: codecvt const &) "(? कनवर्ट करें @ p ath_traits @ filesystem3 @ boost @@ YAXPBD0AAV? $ basic_string @ GU? $ char_traits @ जी @ std @@ वी? $ आवंटक @ जी @ 2 @@ std @@ एबीवी? $ codecvt @ जीडीएच @ 5 @@ ज़ेड)

... obj: त्रुटि एलएनके 2001: अनसुलझा बाहरी प्रतीक "शून्य __cdecl बढ़ावा :: फाइल सिस्टम 3 :: path_traits :: प्रेषण (कक्षा बूस्ट :: फाइल सिस्टम 3 :: निर्देशिका_entry const &, कक्षा std :: basic_string, वर्ग std :: आवंटक> & , कक्षा std :: codecvt const &) "(? प्रेषण @ path_traits @ filesystem3 @ boost @@ YAXABVdirectory_entry @ 23 @ एएवी? $ basic_string @ GU? $ char_traits @ जी @ std @@ वी? $ आवंटक @ जी @ 2 @@ std @@ एबीवी? $ codecvt @ जीडीएच @ 6 @@ जेड)

... obj: त्रुटि एलएनके 2001: अनसुलझा बाहरी प्रतीक "शून्य __cdecl boost :: filesystem3 :: path_traits :: कनवर्ट (हस्ताक्षरित शॉर्ट कॉन्स्ट *, हस्ताक्षरित लघु शंकु सेंट *, कक्षा std :: basic_string, वर्ग std :: आवंटक> &, कक्षा std :: codecvt const &) "(? @ path_traits @ filesystem3 @ boost @@ yAXPBG0AAV को परिवर्तित करें? $ basic_string @ डीयू? $ char_traits @ डी @ std @@ वी $ संभाजक @ डी @ 2 @@ एसटीडी @@ अटल बिहारी वाजपेयी $ codecvt @ GDH @ 5 @@ जेड)

... exe? गंभीर त्रुटि LNK1120: 4 अनसुलझे बाहरी

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

Here मैंने पाया किसी को इस समस्या को इस निष्कर्ष पर आ रही:

यह वास्तव में एक क्यूटी मुद्दा है। एक देशी प्रकार के रूप में wchar_t का उपयोग करके आपको उसी कंपाइलर स्विच का उपयोग करके क्यूटी का पुनर्मूल्यांकन करना होगा। https://bugreports.qt.io/browse/QTBUG-9617

सामान्य तौर पर, आप बहुत सावधान रहना होगा और अपनी परियोजनाओं में संकलक सेटिंग्स wchar_t मिश्रित नहीं होते हैं के रूप में वे असंगत हो जाएगा: वहाँ भी नजर में एक बग है।

तो मैंने क्यूटी सेटिंग /Zc:wchar_t को फिर से संकलित किया, लेकिन इससे कोई प्रभाव नहीं दिखाया गया। मुझे अब भी वही त्रुटि मिलती है।

+0

क्या आपने बढ़ावा संकलित किया है? मैं बिल्कुल परिचित नहीं हूं कि वास्तव में निर्माण की जरूरत है लेकिन कुछ पुस्तकालय क्या करते हैं। – pezcode

+0

हां। अगर मैं सही ढंग से याद करता हूं तो मैंने इसे 'b2.exe' का उपयोग करके विजुअल स्टूडियो 2010 के लिए संकलित किया है। – Pedro

+0

पूरे बूस्ट लाइब्रेरी को पुन: संकलित करना आवश्यक हो सकता है? मुझे सटीक निर्माण कॉन्फ़िगरेशन याद नहीं है, लेकिन जब मैं बूस्ट संकलित कर रहा था, तो मैंने निश्चित रूप से 'build wchar_t को build-in type' प्रॉपर्टी के रूप में नहीं बदला। – Pedro

उत्तर

8

मुझे लगता है कि आप सही रास्ते पर हैं, लेकिन ऐसा लगता है कि आपके -Zc:wchar_t "स्टिक" नहीं थे। हमें Google ब्रेकपैड और आईसीयू लाइब्रेरी से क्यूटी खुश करने के लिए भी वही करना था। हमने /Zc:wchar_t(QT_SOURCE)\mkspecs\win32-msvc2008\qmake.conf में सेटिंग बदल दी और स्रोत से क्यूटी संकलित की, और उसके बाद सबकुछ काम करता है।

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

cl -c -nologo -Zm200 -Zc:wchar_t ... (etc.) 

आप पहले से ही इस विकल्प के बिना क्यूटी का निर्माण किया है, तो आप एक make confclean पहले सब कुछ वास्तव में नई सेटिंग्स के साथ फिर से बनाया जाता है सुनिश्चित करने के लिए करना पड़ सकता है।

यह -Zc:wchar_t will be the default in Qt 5 जैसा लगता है।

0

क्यूटी ने आपके प्रोग्राम की टिपोलॉजी को रनटाइम की कॉन्फ़िगरेशन के संबंध में बदल दिया: इसके परिणामस्वरूप, आप जिस बूस्ट लाइब्रेरी का उपयोग करते हैं (फाइल सिस्टम), जो सम्मेलन नामकरण द्वारा एक्सेस की गई कई कॉन्फ़िगरेशन में आती है - ज्ञात नहीं है।

उदाहरण के लिए, multithread runtimes पुस्तकालय का नाम (मुझे लगता है मैं अच्छी तरह से याद है उम्मीद है, लेकिन वैसे भी डॉक्स जहां विवरण पूरी तरह से प्रलेखित रहे हैं) में एमटी कहीं आवश्यकता होती है।प्रोग्रामिंग के लिए यह नामांकन काफी पारदर्शी है, प्रोगमाम्स के कारण जो प्रोग्रामर को उचित रूप से विभिन्न कंपाइलरों के तहत लाइब्रेरी उपयोग को कम करने के लिए उपयोग किया जाता है।

आपको गैर-wchar filesystem.lib याद करना चाहिए। जब मैंने विंडोज का इस्तेमाल किया, तो मैंने विज़ुअल सी ++ के साथ इंटरफ़ेस करने के लिए बढ़ावा देने के लिए जाम को बढ़ावा दिया (यह पिछले मिलेनियम पर वापस जा सकता है!)। मुझे उम्मीद है कि यह अभी भी प्रयोग योग्य है।

+1

मुझे यकीन नहीं है कि मैं समझता हूं। मैंने अपनी निर्भरताओं और '$ (बूस्ट) \ stage \ lib' निर्देशिकाओं में' boost_filesystem-vc100-mt-1_47.lib 'जोड़ा। पथ निश्चित रूप से ठीक हैं, मैंने उन्हें किसी अन्य प्रोजेक्ट से कॉपी किया है, जो त्रुटियों के बिना संकलित है। मैंने अपनी सभी चादरों की 'रनटाइम लाइब्रेरी' प्रॉपर्टी की जांच की है, और वे सभी मेरे अन्य प्रोजेक्ट में, जैसे कि बहुभाषी डीएलएल (/ एमडी) 'पर सेट हैं। चूंकि ये सेटिंग्स एक जैसी हैं, इसलिए मुझे लगता है कि यह नामकरण समस्या नहीं हो सकती है, या क्या मैं गलत हूं? – Pedro

+0

क्षमा करें, मैं अनुचित रूप से बहुप्रचार को संदर्भित करता हूं, और इसलिए _mt_, आपने स्पष्ट रूप से समझाया कि चरित्र प्रकार में परिवर्तन था। मुझे आशा है कि मैं अपने हिप्पोटिस को बढ़ावा देने, उचित तकनीकी विवरण में सत्यापित कर सकता हूं। – CapelliC

2

बूस्ट-1.4 9, क्यूटी 4.4 और वीएस2005 का उपयोग करना एक ही समस्या थी। प्रोजेक्ट गुणों पर जाकर, "कॉन्फ़िगरेशन प्रॉपर्टीज -> सी/सी ++ -> भाषा -> wchar_t को बिल्ट-इन टाइप" टू "हां" के रूप में समस्या का समाधान करें।

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