Я пытаюсь запустить пример клиента C ++ ZMQ. Код прекрасно компилируется с g ++, но я не могу запустить сгенерированный исполняемый файл из-за следующей ошибки.
./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)
Я использую следующую команду для компиляции кода
g++ pairserver.cpp -o pairserver.out -lzmq
А вот и исходный код
// 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;
}
Я полагаю, что существует конфликт между общими библиотеками Vivado 2016, который был установлен.
После некоторого поиска я обнаружил, что моя библиотека libstdc + была каким-то образом связана с библиотекой libstdc + стороннего производителя (от Vivado). Я использовал команду ldd, чтобы найти связанные библиотеки, и следующие результаты.
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)
Погуглив проблему, я использовал следующую команду
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/Xilinx/Vivado/2016.1/lib/lnx64.o:/usr/lib/x86_64-linux-gnu
Однако это не сработало. Я был очень зол, чтобы решить эту проблему мягко больше.
Я переименовал /opt/Xilinx/Vivado/2016.1/lib/lnx64.o в другое, и мой код работал отлично. Это глупое программное обеспечение «Vivado» вызвало проблему. Это испортило половину моего дня.
Других решений пока нет …