无法正确安装ZeroMQ / 0mq /ØMQ

时间:2017-12-29 15:39:12

标签: c++ linux zeromq failed-installation mint

我想使用ZeroMQ

来进行网络编程

我正在尝试在我的Linux Mint 18.2机器上安装它。也许我只是愚蠢(这就是为什么我来这里寻求帮助)但我似乎无法让这些instructions工作。

主要是从超链接指令开始:

在类UNIX系统上构建

如果您有自由选择,使用ZeroMQ进行开发的最舒适操作系统可能是Ubuntu。

  1. 确保libtool,pkg-config,build-essential,autoconf和 安装了automake。
  2. 检查uuid-dev包,uuid / e2fsprogs RPM或等效项 你的系统已安装。
  3. 解压缩.tar.gz源档案。
  4. 运行./configure,然后运行make。
  5. 安装ZeroMQ系统范围的运行sudo make install。
  6. 在Linux上,安装ZeroMQ后运行sudo ldconfig。
  7. 使用版本4.2.2中的tarball。

    为了测试,我使用了来自0mq的hello world示例(在examples / c ++中):

    git clone --depth=1 https://github.com/imatix/zguide.git
    

    我尝试使用g ++编译hwclient.cpp但是我得到了一堆错误,我假设因为我在系统的任何地方都找不到包含的zmq.hpp(使用locate zmq.hpp)。以下是错误:

    /tmp/ccsb8olx.o: In function `zmq::error_t::error_t()':
    hwclient.cpp:(.text._ZN3zmq7error_tC2Ev[_ZN3zmq7error_tC5Ev]+0x26): undefined reference to `zmq_errno'
    /tmp/ccsb8olx.o: In function `zmq::error_t::what() const':
    hwclient.cpp:(.text._ZNK3zmq7error_t4whatEv[_ZNK3zmq7error_t4whatEv]+0x16): undefined reference to `zmq_strerror'
    /tmp/ccsb8olx.o: In function `zmq::message_t::message_t()':
    hwclient.cpp:(.text._ZN3zmq9message_tC2Ev[_ZN3zmq9message_tC5Ev]+0x23): undefined reference to `zmq_msg_init'
    /tmp/ccsb8olx.o: In function `zmq::message_t::message_t(unsigned long)':
    hwclient.cpp:(.text._ZN3zmq9message_tC2Em[_ZN3zmq9message_tC5Em]+0x2e): undefined reference to `zmq_msg_init_size'
    /tmp/ccsb8olx.o: In function `zmq::message_t::~message_t()':
    hwclient.cpp:(.text._ZN3zmq9message_tD2Ev[_ZN3zmq9message_tD5Ev]+0x14): undefined reference to `zmq_msg_close'
    /tmp/ccsb8olx.o: In function `zmq::message_t::data()':
    hwclient.cpp:(.text._ZN3zmq9message_t4dataEv[_ZN3zmq9message_t4dataEv]+0x14): undefined reference to `zmq_msg_data'
    /tmp/ccsb8olx.o: In function `zmq::context_t::context_t(int)':
    hwclient.cpp:(.text._ZN3zmq9context_tC2Ei[_ZN3zmq9context_tC5Ei]+0x18): undefined reference to `zmq_init'
    /tmp/ccsb8olx.o: In function `zmq::context_t::~context_t()':
    hwclient.cpp:(.text._ZN3zmq9context_tD2Ev[_ZN3zmq9context_tD5Ev]+0x23): undefined reference to `zmq_term'
    /tmp/ccsb8olx.o: In function `zmq::socket_t::socket_t(zmq::context_t&, int)':
    hwclient.cpp:(.text._ZN3zmq8socket_tC2ERNS_9context_tEi[_ZN3zmq8socket_tC5ERNS_9context_tEi]+0x26): undefined reference to `zmq_socket'
    /tmp/ccsb8olx.o: In function `zmq::socket_t::close()':
    hwclient.cpp:(.text._ZN3zmq8socket_t5closeEv[_ZN3zmq8socket_t5closeEv]+0x26): undefined reference to `zmq_close'
    /tmp/ccsb8olx.o: In function `zmq::socket_t::connect(char const*)':
    hwclient.cpp:(.text._ZN3zmq8socket_t7connectEPKc[_ZN3zmq8socket_t7connectEPKc]+0x25): undefined reference to `zmq_connect'
    /tmp/ccsb8olx.o: In function `zmq::socket_t::send(zmq::message_t&, int)':
    hwclient.cpp:(.text._ZN3zmq8socket_t4sendERNS_9message_tEi[_ZN3zmq8socket_t4sendERNS_9message_tEi]+0x2b): undefined reference to `zmq_send'
    hwclient.cpp:(.text._ZN3zmq8socket_t4sendERNS_9message_tEi[_ZN3zmq8socket_t4sendERNS_9message_tEi]+0x46): undefined reference to `zmq_errno'
    /tmp/ccsb8olx.o: In function `zmq::socket_t::recv(zmq::message_t*, int)':
    hwclient.cpp:(.text._ZN3zmq8socket_t4recvEPNS_9message_tEi[_ZN3zmq8socket_t4recvEPNS_9message_tEi]+0x2b): undefined reference to `zmq_recv'
    hwclient.cpp:(.text._ZN3zmq8socket_t4recvEPNS_9message_tEi[_ZN3zmq8socket_t4recvEPNS_9message_tEi]+0x46): undefined reference to `zmq_errno'
    collect2: error: ld returned 1 exit status
    

    为方便起见,这里是 hwclient.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;
    }
    

    我想弄清楚为什么 zmq.hpp 没有安装。

    任何人都可以提出任何关于我可能做错的建议吗?

    感谢。

1 个答案:

答案 0 :(得分:3)

正如评论中所讨论的,您需要为g ++提供正确的链接参数

g++ hwclient.cpp -lzmq

<强>解释
g ++编译分阶段工作,最后一个是“链接”,你的文件链接到包含预编译“定义”的“库”(例如,你正在调用的函数)。

这与处理包含头文件的“预处理”阶段形成对比。头文件(大多数时候)包含函数的“声明”。

长话短说:
如果您看到undefined reference to错误,则在链接过程中会丢失一些库。