2016-12-22 12 views
1

Я бегу ubuntu 16.04 с gcc.компиляция protobuf не работает с D_GLIBCXX_USE_CXX11_ABI = 0

Мой q.ccp файл

#include <google/protobuf/generated_message_util.h> 
#include <google/protobuf/repeated_field.h> 
#include <google/protobuf/extension_set.h> 
#include <google/protobuf/generated_message_reflection.h> 
#include <google/protobuf/generated_message_util.h> 
#include <google/protobuf/stubs/common.h> 
#include <google/protobuf/descriptor.h> 

int main(int argc, char **argv) 
{ 

    google::protobuf::Message* msg; 


    const google::protobuf::Descriptor* message_desc = msg->GetDescriptor(); 


    const google::protobuf::FieldDescriptor * fd_name = message_desc->FindFieldByName("name"); 


    return 0; 
} 

команда используется для компиляции:

g++ -D_GLIBCXX_USE_CXX11_ABI=0 q.cpp -L/usr/lib/x86_64-linux-gnu /usr/local/lib/libprotobuf.a -lpthread 

protoc --version возвращается: 2.2.0

НКУ --version

gcc (Ubuntu 4.8.5-4ubuntu2) 4.8.5 
Copyright (C) 2015 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
Ошибка

компиляции:

/tmp/cciGJPqq.o: In function `main': 
q.cpp:(.text+0x5f): undefined reference to `google::protobuf::Descriptor::FindFieldByName(std::string const&) const' 
collect2: error: ld returned 1 exit status 

Но когда я оставляю возможность -D_GLIBCXX_USE_CXX11_ABI=0, я не получаю ошибку компиляции. Но проблема в том, что я запускаю исполняемый файл в другой системе, который требует компиляции с этой опцией для запуска программы.

+0

Возможный дубликат [Что такое неопределенная ссылка/неразрешенная ошибка внешнего символа и как ее исправить?] (Http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved- external-symbol-error-and-how-do-i-fix) – Danh

+0

@ Danh, c'mon man, по крайней мере, прочитайте полный вопрос. Действительно ли вы серьезно? – v78

+0

Я не изменю свое решение, факт, что g ++ сделал изменение ABI, ваша программа должна быть скомпилирована с тем же ABI с вашей библиотекой – Danh

ответ

0

Если ваша компиляция прошла успешно только с D_GLIBCXX_USE_CXX11_ABI = 0, то вы можете использовать общую библиотеку (libprotobuf), которая предварительно скомпилирована с использованием того же самого или с использованием более старого ABI, например gcc 4.8.

Я бы проверял версию g ++. Это может быть> 5, у которого будет новый ABI.