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

Cannot install ZeroMQ / 0mq / ØMQ properly

我想使用 ZeroMQ

进行网络编程

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

主要是按照这个,来自超链接说明:

在类 UNIX 系统上构建

如果自由选择,用ZeroMQ开发最舒服的OS大概是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。

使用 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 没有被安装。

任何人都可以就我可能做错的地方提供任何建议吗?

谢谢。

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

g++ hwclient.cpp -lzmq

解释:
g++ 编译分阶段进行,最后一个阶段是 "linking",您的文件与包含预编译 "definitions" 的 "libraries" 链接(例如,您正在调用的函数) .

这与处理包含头文件的 "pre-processing" 阶段形成对比。头文件(大部分时间)包含 "declarations" 个函数。

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