Search code examples
c++shared-librarieszeromqvivado

Cannot run executable of C++ ZMQ project on linux


I am trying to run an example C++ ZMQ client. The code compiles fine with g++ but I cannot run the generated executable because following error.

./pairserver.out: /opt/Xilinx/Vivado/2016.1/lib/lnx64.o/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by ./pairserver.out)
./pairserver.out: /opt/Xilinx/Vivado/2016.1/lib/lnx64.o/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by /usr/local/lib/libzmq.so.5)
./pairserver.out: /opt/Xilinx/Vivado/2016.1/lib/lnx64.o/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by /usr/local/lib/libzmq.so.5)
./pairserver.out: /opt/Xilinx/Vivado/2016.1/lib/lnx64.o/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by /usr/local/lib/libzmq.so.5)
./pairserver.out: /opt/Xilinx/Vivado/2016.1/lib/lnx64.o/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /usr/local/lib/libzmq.so.5)

I use following command to compile the Code

g++ pairserver.cpp -o pairserver.out -lzmq

And here is the sourcecode

//  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;
}

I guess there is some conflict between shared libraries of Vivado 2016 which was installed.


Solution

  • After some digging, I have found that my libstdc+ library was somehow linked to a third party libstdc+ library(from Vivado). I have used ldd command to find linked libraries and following were results.

    linux-vdso.so.1 (0x00007ffda7997000)
    libzmq.so.5 => /usr/local/lib/libzmq.so.5 (0x00007f0d9679b000)
    libstdc++.so.6 => /opt/Xilinx/Vivado/2016.1/lib/lnx64.o/libstdc++.so.6 (0x00007f0d96499000)
    libgcc_s.so.1 => /opt/Xilinx/Vivado/2016.1/lib/lnx64.o/libgcc_s.so.1 (0x00007f0d96283000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0d95e92000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f0d95c8a000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f0d95a6b000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f0d956cd000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f0d96c23000)
    

    Googling the problem, I have ended up with using following command

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/Xilinx/Vivado/2016.1/lib/lnx64.o:/usr/lib/x86_64-linux-gnu
    

    However, It didn't worked. I was very angry to deal with the problem in gentle manner anymore. I have renamed /opt/Xilinx/Vivado/2016.1/lib/lnx64.o to something else and my code ran perfectly fine. That stupid software 'Vivado' has caused the problem. It ruined half of my day.