Существует ли обязательная привязка протокольных буферов для 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:
Получите версию 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.Возьмите копию следующего
.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
В соответствии с темой "Dazza" используйте функцию "найти и заменить в файлах" (например, "Блокнот ++"), чтобы переименовать пространство имен google::internal. Обратите внимание, что поиск / замена с учетом регистра обязателен, поскольку в некоторых случаях имя "Internal" используется для других целей. На этом этапе я последовал предложению Dazza изменить его на
google::internals
, (Примечание: это как для libprotobuf-lite, так и для строк, используемых для создания сгенерированного кода)В сгенерированных строках кода найдите все вхождения
memset
и измените их наstd::memset
(Это в первую очередь для генератора кода lib;libprotoc
, Если вы этого не сделаете, каждый раз, когда вы заново генерируете привязки.proto, C++ builder не сможет определитьmemset
,Сборка protoc.exe с использованием Visual Studio (я не смог получить Protoc.exe для сборки в Builder, но в любом случае это не имеет значения, генератор кода нужно собрать только один раз)
Измените пример.proto файлы, используя облегченную среду выполнения;
option optimise_for = LITE_RUNTIME
, Примечание. При включении этой опции возможности отражения недоступны.Бежать
protoc.exe
в вашем.proto файле с--cpp_out
, Выходной файл будет иметь.cc
расширение - вам нужно будет переименовать это в.cpp
Добавьте ваши сгенерированные файлы в ваш проект и соберите.
(Примечание: есть еще несколько предупреждений, одно из которых жалуется на лишнее &
взятие адреса функции и несколько других, жалующихся на сравнения со знаком / без знака - но, по крайней мере, это создает и, кажется, работает)