2016-12-20 5 views
5

मैं अभी सीखना शुरू कर रहा हूं कि zeromq पुस्तकालयों के साथ कैसे काम करना है और विभिन्न सी ++ परियोजनाओं में उनका उपयोग करना है। नमूना कोड है कि मैं ने लिखा है (वास्तव में वहाँ ट्यूटोरियल से नकल) यह है:cmake में zeromq पुस्तकालयों को कैसे आयात करें?

// file: main.cpp 
// Hello World client in C++ 
// Connects REQ socket to tcp://localhost:5555 
// Sends "Hello" to server, expects "World" back 
// 
#include <zmq.hpp> 
#include <string> 
#include <iostream> 

int main() 
{ 
    // Prepare our context and socket 
    zmq::context_t context (1); 
    zmq::socket_t socket (context, ZMQ_REQ); 

    std::cout << "Connecting to hello world server…" << std::endl; 
    socket.connect ("tcp://localhost:5555"); 

    // Do 10 requests, waiting each time for a response 
    for (int request_nbr = 0; request_nbr != 10; request_nbr++) { 
     zmq::message_t request (5); 
     memcpy (request.data(), "Hello", 5); 
     std::cout << "Sending Hello " << request_nbr << "…" << std::endl; 
     socket.send (request); 

     // Get the reply. 
     zmq::message_t reply; 
     socket.recv (&reply); 
     std::cout << "Received World " << request_nbr << std::endl; 
    } 
    return 0; 
} 

और नीचे कमांड के साथ इस फाइल के उत्पादन का निर्माण करके:

g++ main.cpp -o test -lzmq 

फ़ाइल के साथ उत्पन्न हो जाएगा कोई बात नहीं।

समस्या यह है कि मैं यह है कि मैं CMake.Thus का उपयोग कर फ़ाइल का निर्माण करना चाहते है, मैं नीचे के रूप में एक CMakeLists.txt फ़ाइल में लिखा है:

cmake_minimum_required(VERSION 3.6) 
project(test2) 


set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -lzmq") 


set(SOURCE_FILES main.cpp) 
add_executable(test2 ${SOURCE_FILES}) 

बात यह है कि मैंने सोचा था कि निर्माण करने के लिए पर्याप्त होगी कार्यक्रम -lzmq है, लेकिन उस टुकड़े भी शामिल है, मैं प्राप्त निम्न त्रुटि संदेश:

CMakeFiles/test2.dir/main.cpp.o: In function `zmq::error_t::error_t()': 
/usr/include/zmq.hpp:62: undefined reference to `zmq_errno' 
CMakeFiles/test2.dir/main.cpp.o: In function `zmq::error_t::what() const': 
/usr/include/zmq.hpp:66: undefined reference to `zmq_strerror' 
CMakeFiles/test2.dir/main.cpp.o: In function `zmq::message_t::message_t()': 
/usr/include/zmq.hpp:107: undefined reference to `zmq_msg_init' 
CMakeFiles/test2.dir/main.cpp.o: In function `zmq::message_t::message_t(unsigned long)': 
/usr/include/zmq.hpp:114: undefined reference to `zmq_msg_init_size' 
CMakeFiles/test2.dir/main.cpp.o: In function `zmq::message_t::~message_t()': 
/usr/include/zmq.hpp:129: undefined reference to `zmq_msg_close' 
CMakeFiles/test2.dir/main.cpp.o: In function `zmq::message_t::data()': 
/usr/include/zmq.hpp:180: undefined reference to `zmq_msg_data' 
CMakeFiles/test2.dir/main.cpp.o: In function `zmq::context_t::context_t(int)': 
/usr/include/zmq.hpp:204: undefined reference to `zmq_init' 
CMakeFiles/test2.dir/main.cpp.o: In function `zmq::context_t::~context_t()': 
/usr/include/zmq.hpp:225: undefined reference to `zmq_term' 
CMakeFiles/test2.dir/main.cpp.o: In function `zmq::socket_t::socket_t(zmq::context_t&, int)': 
/usr/include/zmq.hpp:251: undefined reference to `zmq_socket' 
CMakeFiles/test2.dir/main.cpp.o: In function `zmq::socket_t::close()': 
/usr/include/zmq.hpp:283: undefined reference to `zmq_close' 
CMakeFiles/test2.dir/main.cpp.o: In function `zmq::socket_t::connect(char const*)': 
/usr/include/zmq.hpp:314: undefined reference to `zmq_connect' 
CMakeFiles/test2.dir/main.cpp.o: In function `zmq::socket_t::send(zmq::message_t&, int)': 
/usr/include/zmq.hpp:321: undefined reference to `zmq_send' 
/usr/include/zmq.hpp:324: undefined reference to `zmq_errno' 
CMakeFiles/test2.dir/main.cpp.o: In function `zmq::socket_t::recv(zmq::message_t*, int)': 
/usr/include/zmq.hpp:331: undefined reference to `zmq_recv' 
/usr/include/zmq.hpp:334: undefined reference to `zmq_errno' 

मैं CMake फ़ाइल में चर का एक और प्रकार सेट करनी चाहिए या मैं एक गलत निर्देशिका में पुस्तकालय स्थापित किया है? या क्या ऐसा कुछ और है जिसका मुझे उल्लेख करना चाहिए था? और जिस सिस्टम विच पर मैं काम कर रहा हूं वह उबंटू 14.04

उत्तर

12

सीएमके में 0 एमक्यू और 0 एमक्यू के लिए सीधा समर्थन शामिल नहीं है जिसमें सीएमके के लिए सीधा समर्थन शामिल नहीं है। लेकिन, 0mq pkg-config का समर्थन करता है और हम इसका उपयोग करने के लिए इसका उपयोग कर सकते हैं। चूंकि आपने उल्लेख किया है कि आप उबंटू 14.04 पर हैं, सुनिश्चित करें कि आपने 0mq पुस्तकालयों, शीर्षलेखों, और pkg-config.pc फ़ाइल को स्थापित करने के लिए sudo apt-get install libzmq3-dev किया है।

फिर निम्न CMakeLists.txt का उपयोग करें जिसे मैंने उपरोक्त आपके संस्करण से संशोधित किया है। (मैं अपने सभी परिवर्तनों को इनलाइन टिप्पणी की है।)

## i have cmake 3.5 
cmake_minimum_required(VERSION 3.5) 
project(test2) 

## use this to globally use C++11 with in our project 
set(CMAKE_CXX_STANDARD 11) 

## load in pkg-config support 
find_package(PkgConfig) 
## use pkg-config to get hints for 0mq locations 
pkg_check_modules(PC_ZeroMQ QUIET zmq) 

## use the hint from above to find where 'zmq.hpp' is located 
find_path(ZeroMQ_INCLUDE_DIR 
     NAMES zmq.hpp 
     PATHS ${PC_ZeroMQ_INCLUDE_DIRS} 
     ) 

## use the hint from about to find the location of libzmq 
find_library(ZeroMQ_LIBRARY 
     NAMES zmq 
     PATHS ${PC_ZeroMQ_LIBRARY_DIRS} 
     ) 

set(SOURCE_FILES main.cpp) 
add_executable(test2 ${SOURCE_FILES}) 

## add the include directory to our compile directives 
target_include_directories(test2 PUBLIC ${ZeroMQ_INCLUDE_DIR}) 
## at the 0mq library to our link directive 
target_link_libraries(test2 PUBLIC ${ZeroMQ_LIBRARY}) 

अब आप अपने प्रोजेक्ट make कर सकते हैं।

❯ make 
[ 50%] Building CXX object CMakeFiles/test2.dir/main.cpp.o 
[100%] Linking CXX executable test2 
[100%] Built target test2 

यदि आप देखना चाहते हैं कि हुड के नीचे क्या हो रहा है, तो वर्बोज़ करें।

❯ make VERBOSE=1 
/usr/bin/cmake -H/home/nega/foo -B/home/nega/foo/build --check-build-system CMakeFiles/Makefile.cmake 0 
/usr/bin/cmake -E cmake_progress_start /home/nega/foo/build/CMakeFiles /home/nega/foo/build/CMakeFiles/progress.marks 
make -f CMakeFiles/Makefile2 all 
make[1]: Entering directory '/home/nega/foo/build' 
make -f CMakeFiles/test2.dir/build.make CMakeFiles/test2.dir/depend 
make[2]: Entering directory '/home/nega/foo/build' 
cd /home/nega/foo/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/nega/foo /home/nega/foo /home/nega/foo/build /home/nega/foo/build /home/nega/foo/build/CMakeFiles/test2.dir/DependInfo.cmake --color= 
make[2]: Leaving directory '/home/nega/foo/build' 
make -f CMakeFiles/test2.dir/build.make CMakeFiles/test2.dir/build 
make[2]: Entering directory '/home/nega/foo/build' 
[ 50%] Building CXX object CMakeFiles/test2.dir/main.cpp.o 
/usr/bin/c++  -std=gnu++11 -o CMakeFiles/test2.dir/main.cpp.o -c /home/nega/foo/main.cpp 
[100%] Linking CXX executable test2 
/usr/bin/cmake -E cmake_link_script CMakeFiles/test2.dir/link.txt --verbose=1 
/usr/bin/c++  CMakeFiles/test2.dir/main.cpp.o -o test2 /usr/lib/x86_64-linux-gnu/libzmq.so 
make[2]: Leaving directory '/home/nega/foo/build' 
[100%] Built target test2 
make[1]: Leaving directory '/home/nega/foo/build' 
/usr/bin/cmake -E cmake_progress_start /home/nega/foo/build/CMakeFiles 0 

आप संकलन लाइन को देखो, तो आप देखेंगे कि

  1. सी ++ 11 का समर्थन (-std=gnu++11 ध्वज के साथ) जोड़ा गया है
  2. कोई -I/path/to/zmq झंडा नहीं है। ऐसा इसलिए है क्योंकि उबंटू /usr/include में zmq.hpp उदासीनता और CMake बहुत चालाक पता चला है कि एक डिफ़ॉल्ट पथ है है, तो यह

आप लिंक लाइन को देखें, तो आपको लगता है कि libzmq.so ध्यान देंगे शामिल किया गया है कुछ नहीं करता है इसके पूर्ण पथ के माध्यम से। कुछ लोगों को यह पसंद नहीं है (स्वयं शामिल) और इसके बजाय -L/lib/dir -lmylib पसंद करते हैं। पूर्ण पथ का उपयोग करना "सीमके रास्ता" है, और आप वास्तव में इसकी सराहना करेंगे क्योंकि आप सीएमके के साथ बढ़ते हैं और इसे बड़ी और अधिक जटिल परियोजनाओं के लिए उपयोग करते हैं (हालांकि आप इसे अभी भी पसंद नहीं करेंगे।)

यह भी ध्यान रखें, कि जब से तुम Ubuntu पर कर रहे हैं हम धोखा दिया जा सकता था और dpkg -L libzmq3-dev उपयोग की गई फ़ाइलों हम तो उन्हें अपने मूल CMAKE_CXX_FLAGS लाइन को जोड़ा गया में रुचि रखते हैं के स्थानों को खोजने के लिए, लेकिन वह धोखा दे और अधिक महत्वपूर्ण है, पोर्टेबल नहीं।

+0

मैक ओएस एक्स और उबंटू पर मुझे एक त्रुटि आई जब तक कि मैंने 'सुडो एपीटी इंस्टॉल libzmq5' [उबंटू] या' ब्रू इंस्टॉल जेएमक्यू '[ओएस एक्स] –

3

एक cmake config फ़ाइल को हाल ही में here libzmq github रिपॉजिटरी में जोड़ा गया है।

यह नवीनतम रिलीज (4.2.1) में अभी तक शामिल नहीं है, लेकिन मुझे विश्वास है कि यह अगली रिलीज में होना चाहिए।

मैंने cmake का उपयोग करके मुख्य संस्करण स्थापित किया है और फिर cppzmq स्थापित किया है, जो libzmq का पता लगाने के लिए find_package(ZeroMQ REQUIRED) का उपयोग करता है। सभी एक आकर्षण की तरह काम किया।

+0

का उपयोग करके ज़ीरोएमक्यू का नवीनतम संस्करण स्थापित नहीं किया, वास्तव में, यही तरीका है अगर आपके पास हेड या आने वाली रिलीज का उपयोग करने की क्षमता है तो जाएं। यदि आप सिस्टम पैकेज का उपयोग कर फंस गए हैं तो मेरा पिछला जवाब जाने का तरीका है। इसे किसी भी पुस्तकालय में भी extrapolated किया जा सकता है जिसमें pkg-config समर्थन है लेकिन cmake कॉन्फ़िगरेशन समर्थन नहीं है। – nega

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