2016-12-22 89 views
1

我正在運行與gcc的Ubuntu 16.04。編譯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

的gcc --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-外部符號錯誤和怎麼辦我修復) – Danh

+0

@Danh,來吧人,至少讀完整個問題。你真的很認真嗎? – v78

+0

我不會改變我的決定,事實是g ++已經做出了ABI變更,您的程序需要與您的庫編譯相同的ABI – Danh

回答

0

如果您的編譯成功只有D_GLIBCXX_USE_CXX11_ABI = 0,那麼您可能正在使用一個共享庫(libprotobuf),該庫使用相同的或使用較舊的ABI進行預編譯,如gcc 4.8。

我會檢查g ++版本。它可能是5,這將有新的ABI。