0

根据我几年前阅读此线程的理解,有人曾经让 Protocol Buffers 与 Codegear C++ Builder 2007 一起工作

https://groups.google.com/forum/?fromgroups=#!topic/protobuf/YapO_DqFVvc

上述 Builder 2007 版本的 protobuf 的作者将其上传到了第 3 方 URL,但是指向它的链接似乎早已失效,从讨论和 Protocol Buffers 2.5.0 的当前状态来看,修复/更改从未从 protobuf 分叉或合并到主干中。

更新: 当将 protoc.exe (2.5.0) 生成的代码用于任一示例 .proto 文件时,C++ Builder 2007 会抱怨许多问题,包括 google::internal 命名空间中名称的“重复条目”(例如as google::internal::kEmptyString - 它还抱怨std::hash基于容器,这memset是一个无法识别的符号。

4

1 回答 1

1

我花了几天时间才找到解决方案,但这是我设法让它在 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. 复制文件夹中的以下.cc文件./src/google/protobuf并将其更改为.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
    stubs\common.cpp
    stubs\once.cpp
    io\coded_stream.cpp
    io\zero_copy_stream.cpp
    io\zero_copy_stream_impl_lite.cpp
    
  3. 根据 'Dazza' 的线程,使用 find-and-replace-in-files(例如 Notepad++)重命名 google::internal 命名空间。请注意,需要区分大小写的查找/替换,因为有时会出现名称“内部”用于其他事物的情况。对于这一步,我按照 Dazza 的建议将其更改为google::internals. (注意 - 这既适用于 libprotobuf-lite 也适用于用于生成代码的字符串)

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

  5. 使用 Visual Studio 构建 protoc.exe(我无法让 Protoc.exe 在 Builder 中构建,但这不重要,代码生成器只需要构建一次)

  6. 使用 lite 运行时修改示例 .proto 文件; option optimise_for = LITE_RUNTIME. 注意 - 打开此选项后,反射功能不可用。

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

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

(注意 - 仍然有一些警告未解决 - 一个抱怨多余&的函数地址,还有一些抱怨有符号/无符号比较 - 但至少它构建并且似乎有效)

于 2013-04-27T11:12:25.913 回答