Codegear c++ Builder 2007是否有协议缓冲区绑定?

Is there a Protocol Buffers binding for Codegear C++ Builder 2007?

本文关键字:协议 缓冲区 绑定 是否 c++ Builder 2007 Codegear      更新时间:2023-10-16

从我几年前阅读这篇文章的理解来看,有人曾经使用Codegear c++ Builder 2007获得协议缓冲区

https://groups.google.com/forum/?fromgroups= !主题/protobuf YapO_DqFVvc

上述Builder 2007版本的protobuf的作者将其上传到第三方URL,但是到它的链接似乎已经死了,并且从讨论和Protocol Buffers 2.5.0的当前状态判断,修复/更改从未从protobuf分叉或合并到主干中。

更新:当使用生成的代码从protocol .exe(2.5.0)的任何一个例子。proto文件,c++ Builder 2007抱怨了大量的问题,包括"重复条目"的名称在google::内部命名空间(如google::internal::kEmptyString -它还抱怨基于std::hash的容器和memset是一个无法识别的符号。

我花了几天时间才找到一个解决方案,但下面是我如何在Codegear 2007中使其工作的:

  1. 获取protobuf的c++ Builder版本https://github.com/saadware/protobuf-cppbuilder -这是基于2.4.1的,所以它有点过时,但我猜有可能将c++ Builder更改合并到2.5.0(或任何最新版本)。protobuf的c++ Builder版本是针对Builder 2009的,但是它修复了std::hash的各种问题,所以它是一个比Google版本更好的起点。

  2. ./src/google/protobuf文件夹中复制以下.cc文件并将其更改为.cpp扩展名。.cbproj格式似乎有一个问题,它不像.cc(你需要将所有这些文件添加到你的Codegear 2007 .cbproj -这些是libprotobuf-lite所需的文件)。

    extension_set.cpp
    generated_message_util.cpp
    message_lite.cpp
    repeated_field.cpp
    wire_format_lite.cpp
    stubscommon.cpp
    stubsonce.cpp
    iocoded_stream.cpp
    iozero_copy_stream.cpp
    iozero_copy_stream_impl_lite.cpp
    
  3. 根据'Dazza'的线程使用查找和替换文件(例如notepad++)来重命名google::内部命名空间。请注意,需要区分大小写的查找/替换,因为有时会将名称"Internal"用于其他事情。对于这一步,我按照Dazza的建议将其更改为google::internals。(注意-这既适用于libprotobuf-lite,也适用于用于生成代码的字符串)

  4. 在生成的代码字符串中,搜索所有出现的memset并将它们更改为std::memset(这主要用于代码生成器库;libprotoc。如果不这样做,每次重新生成.proto绑定时,c++构建器将无法识别memset

  5. 使用Visual Studio构建protoc.exe(我无法获得protoc.exe构建在Builder中,但这应该无关紧要,代码生成器只需要构建一次)

  6. 修改示例.proto文件使用lite运行时;option optimise_for = LITE_RUNTIME

  7. 使用--cpp_out在.proto文件上运行protoc.exe。输出文件将具有.cc扩展名-您需要将其重命名为.cpp

  8. 将生成的文件添加到您的项目并构建

(注意-仍然有一些突出的警告-一个抱怨多余的&获取函数的地址,以及其他一些抱怨有符号/无符号比较-但至少它构建并且似乎可以工作)