2013-02-26 11 views
7

मेरे पास एक फ़ाइल foo.h है जिसमें कार्यों के लिए विभिन्न घोषणाएं हैं। इन सभी कार्यों को एक फ़ाइल foo.dll में लागू किया गया है।मैं अपनी परियोजना में एक डीएलएल कैसे लिंक करूं? त्रुटि LNK2019: अनसुलझा बाहरी प्रतीक

bar.obj : error LNK2019: unresolved external symbol SomeFunction 

इतनी स्पष्ट रूप से समारोह कार्यान्वयन नहीं मिला जा रहा है: हालांकि, जब मैं ज फ़ाइल को शामिल और कार्यों के किसी भी उपयोग करने की कोशिश, मैं त्रुटि मिलती है।

संकलक को DLL में परिभाषाओं को खोजने में मदद करने के लिए मुझे क्या करना है और उन्हें .h फ़ाइल से संबद्ध करना है?

मैंने __declspec(dllexport) और __declspec(dllimport) के बारे में कुछ सामान देखा है, लेकिन मैं अभी भी इसका उपयोग नहीं कर सकता हूं।

+0

क्या आप अपने निष्पादन योग्य को 'foo.dll' की आयात लाइब्रेरी से जोड़ रहे हैं (आमतौर पर नाम' foo.lib')? –

+0

मैं इसके लिए नया हूं इसलिए मुझे सच में यकीन नहीं है कि यह कैसे किया जाता है। क्या यह परियोजना के लिए दृश्य स्टूडियो के गुणों में है? – xcdemon05

+1

@ xcdemon05, हां, वहां लिंकर विकल्पों के बीच। –

उत्तर

8

आप DLL मालिक से कम से कम तीन फ़ाइलें प्राप्त होना चाहिए। डीएलएल जिसे आपको रनटाइम, .h फ़ाइल पर निर्यात किए गए कार्यों की घोषणाओं के साथ आवश्यकता होगी, आपके पास पहले से ही यह है। और एक .lib फ़ाइल, डीएलएल के लिए आयात पुस्तकालय। जो लिंकर की आवश्यकता है, इसलिए यह जानता है कि प्रोग्राम की आयात तालिका में फ़ंक्शंस कैसे जोड़ना है।

आप उस चरण को खो रहे हैं जहां आपने लिंकर को बताया था कि उसे .lib फ़ाइल को लिंक करने की आवश्यकता है। इसे आपके प्रोजेक्ट की लिंकर के इनपुट + अतिरिक्त निर्भरता सेटिंग में जोड़ा जाना आवश्यक है। या सबसे आसानी से अपने स्रोत कोड में लिंकर अनुदेश लिख कर किया:

#include "foo.h" 
#pragma comment(lib, "foo.lib") 

कौन सा MSVC के लिए काम करता है, अन्यथा पोर्टेबल नहीं लेकिन कभी जोड़ने है। अपनी परियोजना निर्देशिका में .lib फ़ाइल की प्रतिलिपि बनाएँ या पूर्ण पथ निर्दिष्ट करें।

+0

क्या '#pragma टिप्पणी' का उपयोग करने और' परियोजना गुण> लिंकर> इनपुट' में lib फ़ाइल जोड़ने के बीच कोई अंतर है? – Nitay

+1

कोई फर्क नहीं पड़ता, आप बस उस सेटिंग को बदलना नहीं भूल सकते हैं। –

3
  1. आप dll
  2. आप आयात या प्रक्रिया स्मृति में .dll फ़ाइल को लोड करने की आवश्यकता के निर्माण के समय में समारोह परिभाषाओं __declspec (dllexport) कीवर्ड के सामने एक निर्दिष्ट करने के लिए की जरूरत है।
  3. आपको उस कार्य का पता प्राप्त करने की आवश्यकता है जिसे आप उस डीएलएल से उपयोग करना चाहते हैं।

कुछ उपयोगी लिंक आरंभ करने के लिए :: MSDN Documentation, SO, Random

6

मुझे बस एक ही समस्या थी। समाधान यह साबित हुआ कि डीएलएल 64 बिट था, और इसका उपयोग करने वाला सरल ऐप 32 था। मैं इसे कॉन्फ़िगरेशन मैनेजर में x64 में बदलना भूल गया था।

+2

आपने इंटरनेट खोजने के तीन घंटे बाद बस अपना दिन बचाया। – Dan

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