2010-08-05 13 views
8

के बिना libcurl का उपयोग कर मैं माइक्रोसॉफ्ट विजुअल सी ++ 2010 का उपयोग कर रहा हूं, और मुझे एक ऐसा एप्लिकेशन बनाने की ज़रूरत है जिसके लिए libcurl dll की आवश्यकता नहीं है। मैं प्रीप्रोसेसर निर्देशों में CURL_STATICLIB को परिभाषित कर रहा हूं और libcurl.lib, libcurl_static.lib, ws2_32.lib, और winmm.lib से लिंक कर रहा हूं, लेकिन इसे अभी भी काम करने के लिए डीएल की आवश्यकता है। अगर मैं केवल libcurl_static.lib से लिंक करता हूं, तो उसने बाह्य प्रतीक त्रुटियों को अपरिभाषित किया है। मैं इसे कैसे काम कर सकता हूं?बिना डीएल

मैंने स्रोत बनाने का भी प्रयास किया है, लेकिन मुझे 13 त्रुटियां मिलती हैं (वाह, दुर्भाग्यपूर्ण संख्या) जो सभी कहते हैं "त्रुटि C2011: 'pollfd': 'struct' प्रकार redefinition"। क्या कोई मुझे libcurl काम करने में मदद कर सकता है?

उत्तर

11

कोई आसान जवाब नहीं है :) Libcurl अन्य तृतीय पक्ष libs पर निर्भर करता है (यह आपके द्वारा उपयोग किए जा रहे बाइनरी वितरण पर निर्भर करता है)। जैसे ही आप डीएलएल से छुटकारा पा लेते हैं - आपको मैन्युअल रूप से संबंधित तृतीय पक्षों से लिंक करना होगा।

ठीक है, तो पहला बिंदु यह है कि आपको libcurl.lib से लिंक नहीं करना चाहिए क्योंकि यह आपको डीएलएल से जोड़ता है जो आप नहीं चाहते हैं।

दूसरा बिंदु - जब आप libcurl_static.lib तो साथ लिंक कर रहे हैं (जैसा कि ऊपर उल्लेख) आप पुस्तकालयों के साथ लिंक करने के लिए उस पर निर्भर भी होगा। ऐसा करने के लिए सरल तरीका कुछ इस तरह करना है:

#if defined CURL_STATICLIB 

#if defined _DEBUG 
#pragma comment(lib, "libcurl-7.19.3-win32-ssl-msvc\\lib\\Debug\\curllib_static.lib") 
#else 
#pragma comment(lib, "libcurl-7.19.3-win32-ssl-msvc\\lib\\Release\\curllib_static.lib") 
#endif 

#pragma comment(lib, "ws2_32.lib") 
#pragma comment(lib, "libcurl-7.19.3-win32-ssl-msvc\\libeay32.lib") 
#pragma comment(lib, "libcurl-7.19.3-win32-ssl-msvc\\openldap.lib") 
#pragma comment(lib, "libcurl-7.19.3-win32-ssl-msvc\\ssleay32.lib") 

#endif 

लेकिन इस तरह से - आप तीन और निर्भरता मिल जाएगा। वैकल्पिक रूप से, आप उनके साथ स्थिर रूप से लिंक करने का एक तरीका खोज सकते हैं, लेकिन यह एक अलग कहानी है।

एक और विकल्प के रूप में - आप सभी सुविधाओं आप अवांछित निर्भरता को दूर करने की जरूरत नहीं है अक्षम करने के बाद स्रोतों से libcurl_static.lib पुनर्निर्माण सकता है (में वर्णित के रूप में "Win32 में विशिष्ट प्रोटोकॉल को अक्षम करने से बनाता है" फ़ाइल को स्थापित की) ।

और अंतिम बिंदु - चूंकि libcurl के स्रोतों से विंडोज संकलन के लिए काफी खराब समर्थन है, तो मैं आपको curllib.dll से छुटकारा पाने के विचार पर फिर से विचार करने की सलाह दूंगा।

1

मुझे libcurl प्रोजेक्ट और मेरे आवेदन के प्रीप्रोसेसर निर्देशों में HTTP_ONLY और CURL_STATICLIB दोनों को निर्दिष्ट करके संकलित और लिंक करने के लिए libcurl का एक स्थिर निर्माण मिला है। यह उन प्रोटोकॉल द्वारा आवश्यक सभी निर्भरताओं को समाप्त करता है जिनकी आपको आवश्यकता नहीं है। आवेदन अब किसी भी डीएलएल की आवश्यकता के बिना काम करता है।

उपरोक्त के अलावा, मुझे बस यह सुनिश्चित करने की आवश्यकता है कि libcurl.lib और कर्ल के पथ में एप्लिकेशन को एप्लिकेशन के दृश्य स्टूडियो प्रोजेक्ट सेटिंग्स में सेट किया गया था।

संदर्भ मैं प्रयोग किया है:

Win32 में विशिष्ट प्रोटोकॉल को अक्षम करने से बनाता है: http://curl.haxx.se/mail/lib-2011-12/0123.html

(बाहर दिनांकित) दृश्य स्टूडियो में libcurl का उपयोग करना: http://curl.haxx.se/libcurl/c/visual_studio.pdf