Насколько я понимаю, читая эту ветку несколько лет назад, кто-то однажды получил 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
это нераспознанный символ.
Мне потребовалось несколько дней, чтобы прийти к решению, но вот как мне удалось заставить его работать в 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» используйте поиск и замену в файлах (например, Notepad ++), чтобы переименовать пространство имен 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
Добавьте ваши сгенерированные файлы в ваш проект и соберите.
(Примечание: есть еще несколько предупреждений, одно из которых жалуется на лишнее &
взятие адреса функции и несколько других, жалующихся на сравнения со знаком / без знака — но, по крайней мере, это создает и, кажется, работает)
Других решений пока нет …