2017-01-02 5 views
0

Я делаю проект, в котором я использую protobuf. У меня установлена ​​версия 3.1.0.Получение protobuf связывания ошибок даже после, казалось бы, связывания библиотек protobuf (C++)

Я написал программу для тестирования сериализации в Protobuf, который выглядит как этот

// This file exists to facilitate testing 

//MIST.cpp 

//#include <asio.hpp> 
#include <Task.hpp> //user defined, not relevant 
#include <MIST.hpp> //user defined, not relevant 
#include <ReceiveData.hpp> //user defined, not relevant 
#include <MIST.pb.h> //protobuf file made from protoc 

int main() { 
    /*MIST::ReceiveData receiveObj; 
    std::string s = receiveObj.receive<64>(); 
    std::cout << "Message received: '" << s << "'" << std::endl;*/ 

    ProtobufMIST::Task taskObj; 
    taskObj.set_task_name("The Best Task"); 
    taskObj.set_task_id("7"); 

    std::string* message; 
    if(!taskObj.SerializeToString(message)) 
     std::cout << "Task '" << taskObj.task_name() << "'" << " not serialized successfully\n"; 
    else 
     std::cout << message << std::endl; 

    return 0; 
} 

Я составил его с помощью сценария сборки. Основная команда: g++ std=c++1y [link include files] -lpthread MIST.cpp -lprotobuf -o a.o

Эта команда успешно завершается.

Я затем попытаться связать a.o с командой g++ a.o -std=c++1y -L/usr/local/lib/ -lprotobuf -o a и я получаю следующую ошибку

a.o: In function `main': 
MIST.cpp:(.text+0x20): undefined reference to `ProtobufMIST::Task::Task()' 
MIST.cpp:(.text+0x55): undefined reference to `google::protobuf::MessageLite::SerializeToString(std::string*) const' 
MIST.cpp:(.text+0xd0): undefined reference to `ProtobufMIST::Task::~Task()' 
MIST.cpp:(.text+0xf2): undefined reference to `ProtobufMIST::Task::~Task()' 
a.o: In function `google::protobuf::internal::GetEmptyStringAlreadyInited()': 

MIST.cpp:(.text._ZN6google8protobuf8internal27GetEmptyStringAlreadyInitedEv[_ZN6google8protobuf8internal27GetEmptyStringAlreadyInitedEv]+0x5): undefined reference to `google::protobuf::internal::fixed_address_empty_string' 
collect2: error: ld returned 1 exit status 

Я не знаю, как там могут быть неопределенные ссылки включить файлы, которые я уже скомпилирован, или как там могут быть неопределенными ссылками на protobuf, когда я включил как -L/usr/local/lib, так и -lprotobuf. Я в тупике, как в чем проблема.

Для справки, я пытался реализовать эти решения мало успеха

problems with linking protobuf library

Linking protobuf library with code (Google protocol buffers)

Can't compile example from google protocol buffers

Запуск Kubuntu 16.10 на виртуальной машине. Хост - это Windows 10.

+0

Как обновление: Я переустановил Protobuf и многие ошибки исчезли, ошибка в настоящее время читает ао: В функции 'главного:. MIST.cpp :(текст + 0x20): неопределенная ссылка на 'ProtobufMIST: : Task :: Task() ' MIST.cpp :(. Text + 0xd0): неопределенная ссылка на 'ProtobufMIST :: Task :: ~ Task()' MIST.cpp :(. Text + 0xf2): неопределенная ссылка на 'ProtobufMIST :: Task :: ~ Task() ' collect2: error: ld возвращен 1 статус выхода – CyberDork34

+0

ОК, поэтому проблема в том, что я, как идиот, на самом деле не связывал ничего при компиляции. Мне пришлось скомпилировать сгенерированные файлы protobuf в .o и скомпилировать его с помощью a.o. – CyberDork34

ответ

0

Составьте файл .pb.cc в файл .o и связать его с основной программой, это должно решить проблему.

 Смежные вопросы

  • Нет связанных вопросов^_^