将生成的protobuf文件编译到静态库中

问题描述

我有几个项目都依赖于生成的protobuf C ++文件。以前的维护者只是将源添加到每个目标中(导致生成的cpp文件将被多次构建)。我以为可以通过将每个protobuf cpp文件作为一个静态库构建一次,然后根据需要将它们链接到每个目标中来节省一些时间。

一切都建立了,但是目标程序不再起作用。我将错误追溯到以下代码

const google::protobuf::Descriptor *desc = google::protobuf::DescriptorPool::generated_pool()->FindMessageTypeByName("my.type");
google::protobuf::Message *msg = google::protobuf::MessageFactory::generated_factory()->GetPrototype(desc)->New();

当我将protobuf文件作为静态库链接时,FindMessageTypeByName()方法调用始终返回nullptr。通过阅读,我发现DescriptorPool::generated_pool()包含在编译时构建的协议消息:

生成的协议消息类,已编译为二进制文件 将在该池中分配其描述符。

这引起了几个问题(回答其中任何一个问题都是很有教育意义的):

  1. protobuf库如何管理此注册?感觉我需要生成一个函数以在main之前作为钩子运行,或者可能是要调用的初始化函数的静态列表。
  2. 是否有一种方法可以将预编译的protobuf cpp文件静态链接自动添加生成的池中的方式?
  3. 如果不可能2,如何将这些预编译的原始文件添加到新池中?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)