Существует ли обязательная привязка протокольных буферов для Codegear C ++ Builder 2007?

Насколько я понимаю, читая эту ветку несколько лет назад, кто-то однажды получил Protocol Buffers, работающий с Codegear C ++ Builder 2007

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

Автор вышеуказанной версии Probubuf для Builder 2007 загрузил его на сторонний URL, однако ссылка на него устарела, и, судя по обсуждению и текущему состоянию Protocol Buffers 2.5.0, исправление / изменение никогда не было был разветвлен из протобуфа или слит в багажник.

Обновлено:
При использовании сгенерированного кода из protoc.exe (2.5.0) для любого из примеров файлов .proto C ++ Builder 2007 жалуется на множество проблем, в том числе «дублирующиеся записи» для имен в пространстве имен google :: internal (например, google::internal::kEmptyString — он также жалуется на std::hash на основе контейнеров и memset это нераспознанный символ.

0

Решение

Мне потребовалось несколько дней, чтобы прийти к решению, но вот как мне удалось заставить его работать в 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» используйте поиск и замену в файлах (например, Notepad ++), чтобы переименовать пространство имен google :: internal. Обратите внимание, что поиск / замена с учетом регистра обязателен, поскольку в некоторых случаях имя «Internal» используется для других целей. Для этого шага я последовал предложению Dazza изменить его на google::internals, (Примечание: это как для libprotobuf-lite, так и для строк, используемых для создания сгенерированного кода)

  4. В сгенерированных строках кода найдите все вхождения memset и измените их на std::memset (Это в первую очередь для генератора кода lib; libprotoc, Если вы этого не сделаете, каждый раз, когда вы заново генерируете привязки .proto, C ++ builder не сможет определить memset,

  5. Сборка protoc.exe с использованием Visual Studio (я не смог получить Protoc.exe для сборки в Builder, но в любом случае это не должно иметь значения, генератор кода нужно собрать только один раз)

  6. Измените пример .proto файлы, используя облегченную среду выполнения;
    option optimise_for = LITE_RUNTIME, Примечание. При включении этой опции возможности отражения недоступны.

  7. Бежать protoc.exe в вашем .proto файле с --cpp_out, Выходной файл будет иметь .cc расширение — вам нужно будет переименовать это в .cpp

  8. Добавьте ваши сгенерированные файлы в ваш проект и соберите.

(Примечание: есть еще несколько предупреждений, одно из которых жалуется на лишнее & взятие адреса функции и несколько других, жалующихся на сравнения со знаком / без знака — но, по крайней мере, это создает и, кажется, работает)

1

Другие решения

Других решений пока нет …