链接协议缓冲区编译器生成的文件时的多重定义

时间:2019-07-18 11:51:50

标签: c++ linker protocol-buffers linker-errors grpc

我有一个程序,该程序链接静态库。该程序使用gRPC进行通信,但是链接到该程序的库也使用gRPC。该库由3RD一方提供为二进制文件。构建程序时,出现链接器错误:

  

/usr/local/lib/libprotobuf.a(repeated_field.o):在函数中   google :: protobuf :: internal :: RepeatedPtrFieldBase :: InternalExtend(int)':   /usr/local/include/protobuf/src/google/protobuf/repeated_field.cc:48:   的多重定义   google :: protobuf :: internal :: RepeatedPtrFieldBase :: InternalExtend(int)'   /opt/shared/code/lib/libadapter.a(repeated_field.o):/opt/shared/grpc/third_party/protobuf/src/google/protobuf/repeated_field.cc:46:   首先在这里定义

协议缓冲区编译器自动生成的文件中使用的gRPC与静态库的一部分gRPC之间存在冲突,因为我的代码是空的main函数:)

当我添加从.proto文件(driver.pb.cc)自动生成的文件时,出现问题。当我在cmake中删除带有此文件的行时,多定义问题消失了。

我正在使用CMAKE进行编译,有趣的部分:

ADD_EXECUTABLE (${PROJECT_NAME}
  driver.pb.cc  # when commented, there is no linking error
  driver.cc
)

TARGET_LINK_LIBRARIES(${PROJECT_NAME}
    adapter.a
    grpc++_unsecure
    protobuf
)

driver.cc:

int main(int argc, const char* argv[]) {
  return 0;
}

driver.pb.cc:

// Generated by the protocol buffer compiler.  DO NOT EDIT!
// source: driver.proto
// and so forth .................................

无论如何,文件driver.pb.cc很好,当我不链接静态库时,通信客户端-服务器将与此文件配合使用。

问题:

  • 我可以指望3RD方库有问题吗?我应该报告该错误吗?他们将能够修复它吗?怎么样?
  • 我该如何解决(解决方法)此问题?问题出在自动生成的文件和3RD party提供的库之间,但也许我可以以某种方式解决它。.

0 个答案:

没有答案