В предыдущем видео мы с вами познакомились с синтаксисом в proto3, а также научились использовать компилятор protoc для того, чтобы создавать исходники на C++ из proto-файлов. Но когда мы работаем над большим проектом, естественно, вручную каждый раз перезапускать компилятор protoc, когда мы меняем proto-файлы, неудобно. И поэтому хочется как-то настроить нашу среду разработки таким образом, чтобы она автоматически создавала, генерировала исходники на C++ при изменении proto-файлов. И именно этим мы с вами и займемся в этом видео. Делать это мы будем таким образом. Для начала создадим папку, назовем ее address-book. Здесь будут лежать исходники нашего проекта. Мы с вами в предыдущем видео создали файл person.proto с описанием двух сообщений. И сюда же мы положим простой файл main.cpp, которому на самом деле ничего и не будет. Пока что. Дальше мы для того чтобы у нас была автоматическая генерация C++ кода из proto-файлов, опять же, воспользуемся сборочной системой CMake, которую мы использовали для того, чтобы собрать protobuf. Проект на CMake описывается в специальном файле, который должен называться CMakeLists.txt. Вот мы с вами его создали. И давайте мы его напишем. На самом деле он у меня заранее заготовлен. Он достаточно большой, поэтому я его просто скопирую. Выглядит он вот таким образом. Он задает минимальную версию CMake, которая ему подходит. Задает, что мы пишем на C++ 17. Дальше с помощью специальных команд он находит, где находится библиотека protobuf, и подключает ее к проекту. Это такое описание проекта на CMake, которое позволяет в итоге его скомпилировать, подключив библиотеку protobuf. При этом вы можете видеть, что вот здесь у нас уже указан файл person.proto — это тот самый файл, который мы написали в предыдущем видео, и вот этот файл main.cpp, пока что пустой, который мы создали. Хорошо. Что мы делаем дальше? Дальше мы выходим из своей папки и создаем еще одну папку, которая называется address-book-build. Создаем эту папку. Переходим в нее. И в этой папке запускаем консоль. Запускаем консоль. И выполняем следующую команду: cmake (только надо будет указать полный путь) c:\dev\cmake, ..., bin\cmake. Дальше -G "Eclipse CDT4- MinGW Makefiles". Makefiles с маленькой буквы. Дальше -DCMAKE_PREFIX_ PATH=c:\dev\ protobuf. И указать путь к исходникам. Запускаем CMake, он создает свои файлы, которые ему нужны для последующей сборки проекта. Готово. Давайте посмотрим, что мы с вами здесь сделали. Причем мы это сделаем таким образом. Мы зайдем в нашу папку и увидим, что после выполнения CMake у нас здесь появились файлы .cproject и .project. Те из вас, кто вместе со мной пользуется Eclipse для того, чтобы работать над задачами нашей специализации или как-то изучать C++, уже знают, что эти файлы — это файлы проектов для Eclipse. И они у нас появились здесь потому, что мы здесь в опции -G указали Eclipse CDT4. Дело в том, что cmake умеет генерировать файлы для проектов различных IDE. Если мы вызовем CMake с параметром просто -G, он нам выдаст список тех форматов формирования make файлов, которые он поддерживает. Мы можем видеть, что CMake умеет генерировать проекты для Visual Studio. Он умеет генерировать проекты для Eclipse. Кроме того, я знаю, что многие слушатели нашей специализации используют Cute Creator и CLion. Так вот, вот эти две IDE нативно поддерживают CMake, поэтому в них можно прямо открывать файл CMakeLists.txt и уже получать готовый проект. Если же у вас Visual Studio или Eclipse, то надо выполнять вот такое действие, которое я только что сделал. Другим важным моментом является то, что я здесь передал этот параметр DCMAKE_PREFIX_PATH. Он нужен мне на Windows и с учетом того, что я использую MinGW, если у вас, допустим, Linux, то его не надо указывать, у вас после правильной установки protobuf все будет работать и без него. Хорошо. Мы сформировали проект в Eclipse, теперь мы можем в Eclipse его открыть. Переключаемся на Eclipse, текущий проект мы пока закроем, он нам не нужен. Дальше делаем вот что. Делаем New Import Existing Projects into Workspace и находим на компьютере тот проект, который мы с вами сгенерировали. Вот Eclipse нашел какой-то проект, мы его открываем и можем на него посмотреть. Допустим, у него есть исходники. И тут те файлы, которые мы с вами создали: main.cpp, CMakeLists.txt и person.proto. Давайте откроем main.cpp и сделаем вот что: объявим функцию main и подключим person.pb.h. Запустим сборку. Компилируем наш проект, и он все еще компилируется. И компилируется успешно. Ошибок у нас нет, все хорошо. Значит, в результате компиляции у нас произошло вот что. У нас вызвался компилятор protoc, если мы посмотрим на структуру нашего проекта, то здесь есть такая папка Targets, в ней есть main. И здесь есть Source Files. И мы видим, что у нас появился файл person.pb.cc. Как раз это демонстрирует, что у нас исходники на C++ сгенерировались автоматически. При этом Eclipse немного подумал и нашел файл person.pb.h. Вот он получившийся автоматически. Давайте мы нашу программу выполним. Хорошо. Дальше. Дальше мы сделаем вот что. Мы возьмем, допустим, наш объект типа Address. addr. Допустим, вызовем у него метод set_building (15). У нас все отлично компилируется. Хорошо. Мы настроили Eclipse так, чтобы он автоматически пересобирал генерируемые файлы, если у нас меняется файл с protobuf. Единственное отличие от привычного нам режима работы состоит в том, что если раньше мы, допустим, добавляли в проект какой-то файл, то этот файл автоматически подхватывался и участвовал в сборке проекта. Сейчас у нас проект, созданный с помощью CMake, поэтому это так уже не работает. Поэтому нам придется обновлять список файлов в CMakeLists.txt. Чтобы это продемонстрировать, давайте сделаем вот что. Давайте мы создадим еще один файл, самый обычный файл. Назовем его address.proto и перенесем в него сообщение Address. Перенесем, поместим сюда. Здесь тоже скажем, что у нас используется синтаксис proto3. А здесь, чтобы наш файл был виден, чтобы заимпортировать вот это сообщение Address в Person, напишем import "address.proto". Готово. И запустим компиляцию. Запускаем компиляцию. Компиляция у нас неуспешна, потому что точки с запятой нет. Запускаем компиляцию еще раз, и она все равно неудачная, потому что у нас написано, что компилятор не знает, где находится файл address.pb.h. Этот файл подключается из person.pb.h. Собственно, дело в том, что мы сделали новый proto-файл, но наша сборочная система о нем не знает. Чтобы у нас все заработало, мы открываем CMakeLists.txt и в нем, вот здесь вот, где у нас используется person.proto, добавляем еще address.proto. Запускаем сборку. Сборка продолжается. Продолжается и завершается успешно. Мы видим, что у нас нет ошибок, наш код компилируется, и подключение файла address.pb.h не вызывает никаких проблем. Таким образом, в этом видео мы с вами смогли интегрировать использование библиотеки protobuf в IDE и Eclipse с помощью сборочной системы CMake. И теперь мы можем разрабатывать большие проекты в Eclipse таким образом, что когда мы меняем содержимое наших proto-файлов, то автоматически вызывается компилятор protoc и генерирует необходимые для нас классы, чтобы дальше с ними работать.