美文网首页程序员
CentOS配置Zmqpp

CentOS配置Zmqpp

作者: Lyudmilalala | 来源:发表于2020-05-09 01:03 被阅读0次

    踩坑无数,废了好几个container,特此记录一下
    Centos命令行起始是#,但因为#在代码片里会注释化,就改成$

    1. 预先安装dependency

    $ yum install -y wget gcc-c++ automake autoconf libtool make lsof vim nano boost git
    $ yum -y install openssl-devel bzip2-devel expat-devel gdbm-devel curl-devel boost-devel readline-devel sqlite-devel kernel-devel 
    

    安装时遇到过GPG Keys Failed的错误

    GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
    Public key for perl-threads-2.21-2.el8.x86_64.rpm is not installed. Failing package is: perl-threads-1:2.21-2.el8.x86_64
    GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
    Public key for perl-threads-shared-1.58-2.el8.x86_64.rpm is not installed. Failing package is: perl-threads-shared-1.58-2.el8.x86_64
    GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
    The downloaded packages were saved in cache until the next successful transaction.
    You can remove cached packages by executing 'dnf clean packages'.
    Error: GPG check FAILED
    

    因为用的是docker,于是删了容器重新开个容器就好了
    解决问题的过程中搜到过一个可以尝试的方案,在我的电脑上没有用,不过或许可以帮到大家

    2. 按照官方指令下载三个包

    $ git clone git://github.com/jedisct1/libsodium.git
    $ git clone git://github.com/zeromq/libzmq.git
    $ git clone git://github.com/zeromq/zmqpp.git
    

    3. Build libsodium,这个没有什么问题

    $ cd libsodium
    $ ./autogen.sh
    $ ./configure && make check
    $ make install     // 我用的是docker container所以不需要sudo,没有权限的话要加上
    $ ldconfig           // 我用的是docker container所以不需要sudo,没有权限的话要加上
    

    4. Build libzmq

    $ cd libzmq
    $ ./autogen.sh
    

    这里如果直接跑 ./configure --with-libsodium && make 可能会遇到找不到libsodium的问题

    $ ./configure --with-libsodium && make 
    ............
    checking for working volatile... yes
    checking for sodium... no
    ./configure: line 421: test: then: integer expression expected
    configure: error: run
    ./configure: line 310: return: then: numeric argument required
    ./configure: line 320: exit: then: numeric argument required
    

    猜想是因为调用时无法查看到 libsodium 动态库的地址,于是查看

    $ whereis libsodium
    libsodium: /usr/local/lib/libsodium.so /usr/local/lib/libsodium.a /usr/local/lib/libsodium.la /usr/src/zmq/libsodium
    

    果然,libsodium 并不在默认会查找的 /usr/lib/lib 中,于是添加动态库地址并查看

    $ echo "/usr/local/lib">>/etc/ld.so.conf
    $ cat /etc/ld.so.conf
    include ld.so.conf.d/*.conf
    /usr/local/lib
    

    然后就可以继续了

    $ ./configure --with-libsodium && make
    $ make install     // 我用的是docker container所以不需要sudo,没有权限的话要加上
    $ ldconfig           // 我用的是docker container所以不需要sudo,没有权限的话要加上
    

    5. Build zmqpp

    记得 libzmq 的动态库地址也要include进 /etc/ld.so.conf

    $ cd zmqpp
    $ make
    $ make check
    $ sudo make install
    $ make installcheck
    

    6. 编译

    取了官方simple_client和simple_server例子,想着终于装好了可以跑了,结果

    $ g++ -o server server.cpp -lzmq
    /tmp/ccOYmpjR.o: In function `main':
    server.cpp:(.text+0x74): undefined reference to `zmqpp::socket::socket(zmqpp::context const&, zmqpp::socket_type)'
    server.cpp:(.text+0x8a): undefined reference to `zmqpp::socket::bind(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
    server.cpp:(.text+0x99): undefined reference to `zmqpp::message::message()'
    server.cpp:(.text+0xb7): undefined reference to `zmqpp::socket::receive(zmqpp::message&, bool)'
    server.cpp:(.text+0x15d): undefined reference to `zmqpp::socket::send(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)'
    server.cpp:(.text+0x193): undefined reference to `zmqpp::message::~message()'
    server.cpp:(.text+0x1fa): undefined reference to `zmqpp::message::~message()'
    server.cpp:(.text+0x20e): undefined reference to `zmqpp::socket::~socket()'
    /tmp/ccOYmpjR.o: In function `zmqpp::context::~context()':
    server.cpp:(.text._ZN5zmqpp7contextD2Ev[_ZN5zmqpp7contextD5Ev]+0x20): undefined reference to `zmqpp::context::terminate()'
    /tmp/ccOYmpjR.o: In function `zmqpp::message& zmqpp::message::operator>><std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)':
    server.cpp:(.text._ZN5zmqpp7messagersINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEERS0_RT_[_ZN5zmqpp7messagersINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEERS0_RT_]+0x33): undefined reference to `zmqpp::message::get(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned long) const'
    collect2: error: ld returned 1 exit status
    

    看出来了是找不到library,但到底是怎么个找不到法我思考了很久,终于找到了正确的写法

    $ g++ -o server server.cpp /usr/local/lib/libzmqpp.a -lzmq
    

    不可以少任何一项,也不可以把静态library放到前面写,直接引入-L和 pkg-config 也不管用,很奇怪
    不过终于是真的好了

    $ ./client 
    Connecting to hello world server…
    Sending Hello 0…
    Received World 0
    Sending Hello 1…
    Received World 1
    Sending Hello 2…
    Received World 2
    Sending Hello 3…
    Received World 3
    Sending Hello 4…
    Received World 4
    
    $ ./server
    Received Hello
    Received Hello
    Received Hello
    Received Hello
    Received Hello
    

    相关文章

      网友评论

        本文标题:CentOS配置Zmqpp

        本文链接:https://www.haomeiwen.com/subject/vxgcnhtx.html