#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
, и смог скомпилировать код.