我有一个程序,该程序链接静态库。该程序使用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
很好,当我不链接静态库时,通信客户端-服务器将与此文件配合使用。
问题: