c++ - एक स्थैतिक पुस्तकालय के लिए किसी प्रोग्राम को लिंक करें, जो कि एक और पुस्तकालय से जुड़ता है



visual-studio-2015 static-libraries (1)

मैं एक प्रोग्राम (सी ++) बनाने की कोशिश कर रहा हूं जो Windows (VS2015) पर कई फ़ाइल स्वरूपों को पढ़ सकता है। ऐसा करने के लिए, मैंने माइक्रोग्राम के लिए एक प्रोजेक्ट (जो कि मुख्य कार्यक्रम है) के साथ एक समाधान बनाया है, और MyLibrary के लिए एक प्रोजेक्ट (जिसमें विभिन्न फ़ाइल प्रारूपों के लिए कई पार्सर शामिल हैं)। MyProgram में मैं प्रोग्राम इनपुट के आधार पर कुछ पार्सर्स ऑब्जेक्ट्स बनाता हूं।

सबकुछ अच्छी तरह से काम कर रहा था

हालांकि, मैंने एक नई फ़ाइल प्रारूप पार्सर (निफ्टिपेर्सर) बनाने की कोशिश की जो बाहरी पुस्तकालय, नेफ्टिक्लिक, का उपयोग करता है, जिसे मैंने डाउनलोड और संकलित किया (स्थैतिक लाइब्रेरी के रूप में)।

इसलिए मैंने अपना निफ्टीपार्सर वर्ग बनाया, जो कुछ तरीकों को लागू करता है, और आंतरिक रूप से, यह निफ्टीलिब कहता है मैंने प्रोजेक्ट प्रॉपर्टी में डीआईआर और लाइब्रेरी डियर शामिल किया था, और इसे बिना त्रुटियों के संकलित किया गया मुझे तब एक पार्सर.लिब मिला जो बनाया गया है।

हालांकि, जब मैंने MyProgram को संकलित करने की कोशिश की, तो मुझे एक त्रुटि मिल गई है कि nifticlib लाइब्रेरी के कुछ फ़ंक्शन को हल नहीं किया जा रहा है:

1>------ Build started: Project: Parser, Configuration: Debug x64 ------
1>  nifti_parser.cc
1>  Parser.vcxproj -> C:\Users\Laurent\Documents\C++-build\Projects\Parser\Debug\Parser.lib
2>------ Build started: Project: MyProgram, Configuration: Debug x64 ------
2>Parser.lib(nifti_parser.obj) : error LNK2019: unresolved external symbol nifti_image_read referenced in function "public: __cdecl NiftiParser::NiftiParser(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??0NiftiParser@@[email protected]?[email protected]?[email protected]@[email protected]@V?[email protected]@[email protected]@[email protected]@@Z)
2>C:\Users\Laurent\Documents\C++-build\Projects\Debug\MyProgram.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 1 succeeded, 1 failed, 3 up-to-date, 0 skipped ========== 

मुझे समझ में नहीं आ रहा है कि ऐसा क्यों हो रहा है मैंने माइपरग्रोजेम प्रोजेक्ट को शामिल करने और nifticlib के पुस्तकालय के डायर का मार्ग जोड़ने की कोशिश की, लेकिन मेरे पास अभी कुछ समस्या है

मुझे समझ में नहीं आ रहा है कि विजुअल स्टूडियो के लिए संकलन / लिंकिंग प्रक्रिया क्या है (मैं लिनक्स पर काम करता था)।

ऐसा प्रतीत होता है कि परियोजनाएं केवल संकलित होती हैं अगर यह एक स्थैतिक पुस्तकालय है, और लिंकिंग का हिस्सा तब होता है जब मैं प्रोग्राम को खुद संकलित करने का प्रयास करता हूं क्या मैं सही हू ?

इसके अलावा, मुझे यकीन नहीं है कि जहां nifticlib को लिंक करना चाहिए क्या यह Parser.lib (जहां मैं पुस्तकालय के कार्यों का उपयोग करता है) या सीधे कार्यक्रम के लिए होना चाहिए?

धन्यवाद।

पुनश्च: यह भी मेरे ने पाया कि nifticlib की मेरी स्थापित निर्देशिका में केवल हेडर और .lib शामिल हैं क्या मुझे वहाँ में। सीपीपी भी होना चाहिए, या क्या कार्य पहले से ही .lib में निहित हैं?

संपादित करें: ठीक है, जाहिरा तौर पर एक स्थिर लाइब्रेरी के रूप में कुछ का निर्माण करने से इसे किसी भी चीज़ से लिंक नहीं किया जाता है, इसलिए शायद यही कारण है कि मुझे पार्सर.लिब को संकलित करने का कोई मुद्दा नहीं मिला, क्योंकि यह nifticlib से लिंक नहीं है, लेकिन MyProgram को इसकी आवश्यकता है तो क्या मैं केवल मेरे पार्सर्स परियोजनाओं में नाइटफिबिल के शामिल डायरेक्ट को शामिल करना चाहिए, और अपने माइपरग्रोजेम प्रोजेक्ट में पार्सर.लिब और निफ्टिकलिब को डाल देना चाहिए?


विजुअल स्टूडियो के संकलन / लिंकिंग लिनक्स टूलचेंन्स में क्या हो रहा है उससे काफी भिन्न नहीं है। जब आप एक बाइनरी (एक निष्पादन योग्य या गतिशील लायब्रेरी) बना रहे हैं, तो सभी बाहरी प्रतीकों का समाधान होना चाहिए। जीसीसी में आपको अपने लिंकर के लिए पुस्तकालयों को इंगित करना होगा। कमांड लाइन -lmath लिंकर को लाइब्रेरी खोज के लिए निर्धारित पथों में से एक से libmath.a को लोड करने के लिए बताएगा और आपकी निष्पादन योग्य छवि बनाने के दौरान इसका उपयोग करेगा।

इसी तरह, वीएस में आपको पुस्तकालय निर्देशिकाओं के पथ को सेट करने की आवश्यकता नहीं है, बल्कि लाइब्रेरी फ़ाइल को स्पष्ट रूप से संकेत मिलता है। यह आमतौर पर प्रोजेक्ट गुणों पर किया जाता है -> लिंकर -> इनपुट -> अतिरिक्त निर्भरताएं ध्यान दें कि विंडोज में आप पूरी लाइब्रेरी नाम ( माइलीब.लिब ) डालते हैं , न कि लिब और। ए के बीच का हिस्सा

यह भी ध्यान रखें कि विंडोज में आप डायनेमिक पुस्तकालय (.डीएल) के बाइनरी से लिंक नहीं कर सकते हैं। इसके लिए आपको एक आयात लाइब्रेरी (.lib) की आवश्यकता होगी।

जब आप एक स्थैतिक पुस्तकालय बना रहे हैं, तो टूलचेन बाहरी संदर्भों को हल नहीं करता है यही कारण है कि आप। नीच nifticlib संदर्भित बिना ठीक संकलित

जैसा कि आपको निफ्टी लिंक को लिंक करना चाहिए, यह परिस्थितियों पर निर्भर करता है यदि केवल आपका माय लाइब्रेरी कभी भी नफ्टिक्लिकलिब्ब के कार्यों का उपयोग कर रही है, तो यह आपके स्थैतिक पुस्तकालय से लिंक करने के लिए बुद्धिमान है। हालांकि, अगर किसी दिन आप नेफ़ीस्टिबिल से कुछ फ़ंक्शन सीधे MyProgram में उपयोग करना चाहते हैं, तो लिंक समय पर एक संघर्ष हो सकता है इस मामले में आपको माईप्रोग्राम का निर्माण करते समय केवल निफ्टीलिबिल लिंक करना होगा।

अंगूठे का एक नियम इस तरह तैयार किया जा सकता है:

  • यदि केवल MyLibrary ने nifticlib के हेडर का प्रयोग किया है, तो अपनी लाइब्रेरी को तीसरे पक्ष के साथ लिंक करें
  • यदि MyProgram nifticlib के हेडर का उपयोग करता है (और वास्तव में उनसे कार्य करता है), तो MyProgram निर्माण करते समय nifticlib को लिंक करना बेहतर होता है

यह सख्त विवरण नहीं है, और अधिक जटिल मामलों हैं, लेकिन मूल बातें इस तरह से हैं

और नहीं, आपको सीपीपी फाइलों की जरूरत नहीं है, जब आपकी स्थैतिक लाइब्रेरी का निर्माण करते हैं, जब आप एक अलग परियोजना से उस पुस्तकालय से जुड़े होते हैं। लाइब्रेरी। सीपीपी की सामग्री ऑब्जेक्ट कोड के रूप में पहले से ही स्थिर लिब फ़ाइल में शामिल है

संपादित करें: यदि आप एक स्थैतिक पुस्तकालय से बाहरी लाइब्रेरी के साथ स्थिर लाइब्रेरी लिंक करना चाहते हैं, तो आपको प्रोजेक्ट प्रॉपर्टी - लाइब्रेरियन -> जनरल -> अतिरिक्त निर्भरताएं और बाह्य डालने की आवश्यकता है।





linker-errors