2012-04-28 20 views
11

में एक स्थिर 0MQ पुस्तकालय को जोड़ने यह एक दृश्य स्टूडियो सवाल कुछ और भी अधिक हो सकता ...
मैं VS10 और ZeroMQ 2.2.0 का उपयोग कर a 0MQ C++ example का निर्माण करने की कोशिश कर रहा हूँ।
मैंने windows sources डाउनलोड किया और 0 एमक्यू को स्थिर रूप से बनाने के लिए these instructions का पालन करने का प्रयास किया। विशेष रूप से:वी.एस.

  • समाधान में सभी 7 परियोजनाओं के लिए
  • रिलीज पर स्विच किया गया:
    • Static library (.lib)
    • C/C++\Code Generation\Runtime Library सेट करने के लिए सेट General\Configuration TypeMulti-threaded (/MT)
    • को C/C++\Preprocessor\Preprocessor Definitions
  • को ZMQ_STATIC जोड़ा
  • अपडेट किया गया zmq.h और zmq_utils.h ताकि अगर _MSC_VER और ZMQ_STATIC तो परिभाषित कर रहे हैं DLL_EXPORT भी

परिभाषित किया जाएगा इस बिंदु पर 0MQ अच्छी तरह से निर्माण करने के लिए लगता है।

  • एक खाली कंसोल प्रोजेक्ट निर्मित:
    • _snprintf को srand और snprintf को rand को random बदल उपरोक्त उदाहरण
      • जुड़ा हुआ के साथ एक एकल cpp फ़ाइल, srandom जोड़ा रिलीज में स्विच
    • Multi-threaded (/MT) को C/C++\Code Generation\Runtime Library सेट
    • C/C++\General\Additional Include Directories
    • Linker\Input\Additional Dependencies

को ...\zeromq-2.2.0\builds\msvc\Release\*.lib जोड़ा ...\zeromq-2.2.0\include फ़ोल्डर जोड़ा हालांकि मैं अभी भी निम्न जोड़ने त्रुटियों का सामना करना:

1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_bind 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_close 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_errno 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_init 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_msg_data 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_strerror 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_socket 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_msg_init_size 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_term 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_msg_close 
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_send 

मैं क्या है चुक गया?

उत्तर

17

आपको अपने "खाली कंसोल प्रोजेक्ट" में भी ZMQ_STATICC/C++\Preprocessor\Preprocessor Definitions जोड़ना चाहिए। अन्यथा, जब आप अपने आवेदन संकलन, zmq.h में ZMQ_EXPORT__declspec(dllimport) के रूप में परिभाषित किया गया है, और एक परिणाम के रूप में, MSVC zmq_*

+0

स्पष्टीकरण के लिए, ZMQ_STATIC को परिभाषित करने का अर्थ है कि किसी भी डीएलएल मार्कअप का उपयोग नहीं किया जाता है (न तो __declspec (dllimport) या __declspec (dllexport) परिभाषित किया गया है) –

1

के बजाय __imp__zmq_* प्रतीकों के लिए लग रहा है है स्थिर आप के लिए बहुत महत्वपूर्ण जोड़ने? यदि नहीं, तो आप elnino_9 here द्वारा दूसरे उत्तर को आजमा सकते हैं। विस्तार से चर्चा करते elnino_9 का जवाब:

  • डाउनलोड sources और कुछ स्थानीय फ़ोल्डर में अनज़िप (जैसे C: \ देव \ zeromq)।
  • सी पर जाएं: \ dev \ zeromq-2.2.0 \ builds \ msvc और msvc.sln समाधान खोलें। एमएस -2010 वीएस -2008 से एक वीएस -2010 प्रोजेक्ट
  • सभी परियोजनाओं का निर्माण करेगा।
  • निर्माण दो निम्न फ़ाइलें उत्पन्न करनी चाहिए:
    • C: \ देव \ zeromq \ lib \ libzmq.lib - यह है कि क्या आप अपने प्रोजेक्ट के संयोजक विकल्पों
    • सी में संदर्भ के लिए की आवश्यकता होगी: \ देव \ zeromq_boaz \ builds \ msvc \ release \ libzmq.dll - यह आपको चलाने के लिए आपके प्रोजेक्ट के निष्पादन योग्य के समान फ़ोल्डर में कॉपी करने की आवश्यकता होगी (यदि आपका निर्माण 'डीबग' पर कॉन्फ़िगर किया गया था, तो पथ सी होगा \ देव \ zeromq \ बनाता है \ MSVC \ डीबग \ libzmq.dll)
  • अपने समाधान और परियोजना बनाएँ। निम्न कार्य करें:
    • समाधान एक्सप्लोरर में, प्रोजेक्ट पर राइट-क्लिक करें, और 'गुण' (बहुत नीचे) का चयन करें।
    • 'सी/सी ++ -> सामान्य -> ​​अतिरिक्त निर्देशिकाएं शामिल करें' पर नेविगेट करें और C: \ dev \ zeromq \ include जोड़ें। यह 0 एमक्यू की हेडर फाइलों का संदर्भ देगा।
    • 'लिंकर -> इनपुट -> अतिरिक्त निर्भरता' पर नेविगेट करें और पिछले चरण से 'libzmq.dll' फ़ाइल में पूरा पथ जोड़ें।
    • अपनी परियोजना बनाएं - इसे अब त्रुटियों के बिना जाना चाहिए।
  • अपने निष्पादन योग्य के समान फ़ोल्डर में 'libzmq.dll' की प्रतिलिपि बनाएँ - आपकी परियोजना अब चलनी चाहिए।

कुछ टिप्पणियां:

  • मैं तुम क्यों 'libzmq.lib' फ़ाइल को संदर्भित करने की जरूरत है यकीन नहीं है। निष्पादन योग्य द्वारा इसकी आवश्यकता नहीं है (आप इसे हटा सकते हैं, और यह अभी भी चल जाएगा, क्योंकि आवश्यक तर्क डीएल में रहता है)। क्या कोई इसे समझा सकता है?
  • विंडोज उपयोगकर्ताओं के लिए उदाहरण में एक चेतावनी पर ध्यान दें - दूसरा बाध्यकारी कथन (publisher.bind("ipc://weather.ipc");) अपवाद का कारण बन जाएगा। जैसा कि here समझाया गया है (हालांकि ठीक प्रिंट में), इंटर-प्रोसेस ट्रांसपोर्ट विंडोज पर समर्थित नहीं है।

संपादित

मुझे लगता है कि मेरी पहली टिप्पणी का जवाब MSDN में पाया जा सकता:

"जब बुला निष्पादन के लिए स्रोत कोड संकलित या इकट्ठे है, DLL समारोह कॉल ऑब्जेक्ट कोड में बाहरी फ़ंक्शन संदर्भ उत्पन्न करता है। इस बाहरी संदर्भ को हल करने के लिए, एप्लिकेशन को DLL के निर्माता द्वारा प्रदान की गई आयात लाइब्रेरी (.lib फ़ाइल) से लिंक होना चाहिए। "

+0

प्रश्न विशेष रूप से स्थिर लिंकिंग के बारे में है, इसलिए डीएलएल का उपयोग नहीं किया जाना चाहिए। –

4

मुझे समान त्रुटियां थीं - जब स्थिर रूप से लिंक करने का प्रयास नहीं किया गया था, लेकिन बस एक ZMQ प्रोजेक्ट बनाने और डीएल के लिए .lib 'stubs' को जोड़ने का प्रयास कर रहा था।

मेरे मामले में ऐसा इसलिए था क्योंकि मैं 64-बिट पुस्तकालयों को 32-बिट प्रोजेक्ट में जोड़ने का प्रयास कर रहा था। मैंने गलत संस्करण डाउनलोड किया था। जब मुझे सही मिला, यानी x64 के बजाय x86, यह काम किया।

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