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

Из моего понимания, прочитав эту ветку несколько лет назад, кто-то когда-то получил протокольные буферы, работающие с Codegear C++ Builder 2007

https://groups.google.com/forum/?fromgroups=

Автор вышеуказанной версии 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 это нераспознанный символ.

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" используйте функцию "найти и заменить в файлах" (например, "Блокнот ++"), чтобы переименовать пространство имен 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. Добавьте ваши сгенерированные файлы в ваш проект и соберите.

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

Другие вопросы по тегам