Ошибка связывания в protobuf с zeromq с c

#c #cmake #protocol-buffers #zeromq

#c #cmake #протокол-буферы #zeromq

Вопрос:

Я пытаюсь использовать protobuf с zeromq на c . Я получаю сообщение об ошибке ссылки ниже

 /tmp/cco9X8QH.o: In function `google::protobuf::GoogleOnceInit(long*, void (*)())':
laserscan.pb.cc:(.text._ZN6google8protobuf14GoogleOnceInitEPlPFvvE[google::protobuf::GoogleOnceInit(long*, void (*)())] 0x4f): undefined reference to `google::protobuf::GoogleOnceInitImpl(long*, google::protobuf::Closure*)'
/tmp/cco9X8QH.o: In function `bool google::protobuf::internal::WireFormatLite::ReadPackedPrimitive<float, (google::protobuf::internal::WireFormatLite::FieldType)2>(google::protobuf::io::CodedInputStream*, google::protobuf::RepeatedField<float>*)':
laserscan.pb.cc:(.text._ZN6google8protobuf8internal14WireFormatLite19ReadPackedPrimitiveIfLNS2_9FieldTypeE2EEEbPNS0_2io16CodedInputStreamEPNS0_13RepeatedFieldIT_EE[bool google::protobuf::internal::WireFormatLite::ReadPackedPrimitive<float, (google::protobuf::internal::WireFormatLite::FieldType)2>(google::protobuf::io::CodedInputStream*, google::protobuf::RepeatedField<float>*)] 0x85): undefined reference to `google::protobuf::io::CodedInputStream::BytesUntilLimit() const'
collect2: ld returned 1 exit status  
 

вот мое послание

сканирование.прото

 message Scan{
required float scan_time=1;        // time between scans [seconds]
repeated float ranges=2;        
}
 

вот мой код, в котором я заполняю сообщение и отправляю.

sender.cpp

     Scan proto_msg;
proto_msg.set_scan_time(0.5);
proto_msg.add_ranges(1.0);

    std::string msg_str;
proto_msg.SerializeToString(amp;msg_str);

    zmq::message_t request (msg_str.size());
memcpy ((void *) request.data(), msg_str.c_str(),msg_str.size());
    socket.send (request);
 

команда сборки :

 g   sender.cpp scan.pb.cc scan.pb.h -I /home/sender -l protobuf -l zmq
 

я включил /usr/local/lib в /etc/ld.so.conf и sudo ldconfig .

Я подозреваю, что это связано либо с полем repeat, либо с пространством имен protobuf.

Спасибо.

Комментарии:

1. Попробуйте добавить «package scan_packages;» в начале прото-файла, если вы предполагаете, что это проблема пространства имен. Все кажется правильным. Вы уверены, что он может найти библиотеки? Попробуйте также protobuf-lite, будет ли проблема такой же?

2. @Arkady я попробовал, добавив имя пакета, но результат тот же. версия protobuf-lite выдает больше ошибок.

3. вы построили протобуф? Может ли это быть построено неправильно?

4. да, я создал код, но никаких ошибок при выполнении make, make check и make install не было

5. удалите zmq и все остальное, оставьте только protobuf, будет ли эта проблема? Если да — у вас возникли проблемы со сборкой protobuf.

Ответ №1:

Я нашел причину ошибки связывания. У меня установлена другая версия libprotobuf библиотек. Я сделал ls | grep 'libproto' /usr/lib/ это, и /usr/local/lib результат вы можете увидеть на изображении. Я вручную удалил файлы, связанные с libprotobuf in /usr/lib , и смог скомпилировать код.

введите описание изображения здесь