编译protobuf失败,D_GLIBCXX_USE_CXX11_ABI = 0

时间:2016-12-22 09:55:19

标签: protocol-buffers undefined-reference protoc

我用gcc运行ubuntu 16.04。

我的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选项时,我没有得到编译错误。但问题是我在不同的系统上运行可执行文件,需要使用此选项进行编译才能运行程序。

1 个答案:

答案 0 :(得分:0)

如果您的编译仅在D_GLIBCXX_USE_CXX11_ABI = 0时成功,那么您可能正在使用使用相同或使用旧版ABI(如gcc 4.8)预编译的共享库(libprotobuf)。

我会查看g ++版本。它可能是> 5,将有更新的ABI。