Проект простейшего локомотива: создаем каркас

Проект простейшего локомотива: создаем каркас

Залогом успешной разработки всегда является грамотная организация проекта. Как говорил один из моих учителей: «Программу можно написать в одну строчку и она будет работать. Только разобраться в том, как она работает будет невозможно».

Таким образом, обычно файлы исходного кода организуются в проекты, содержащие сам код и настройки для сборки исполняемых файлов. Не является исключением и QtCreator, имеющий стандартные средства для создания типовых проектов. Мы можем воспользоваться таким мастером, но для более глубокого понимания структуры проекта дополнения создадим пустой проект вручную.

Для начала определимся, что за дополнение мы будем создавать. Пусть это будет локомотив. Однако, на первом этапе мы не будем заботится о его характеристиках и верной логике работы систем — реализуем простейшую выдуманную машину, чтобы понять, за какие рычаги должен дергать разработчик дополнения, чтобы реализовать свои задумки в плане создания более серьезной техники. Мы так и назовем этот локомотив — простейший локомотив.

Создание пустого проекта

Выберем место на диске и создадим там папку с проектом, назовем её simple-loco.

В ней создадим дерево проекта — создадим еще одну папку simple-loco, в которой создадим каталоги include и src. В них будут располагаться, соответственно заголовочные и исходные файлы проекта. Рядом с этим каталогом создаем пустой файл simple-loco.pro, который является сценарием сборки проекта из исходных текстов в QtCreator

Теперь этот pro-файл откроем в QtCreator

Необходимо провести предварительную настройку проекта, в частности указать пути к каталогам, где будет происходить сборка различных конфигураций сборки: отладочной, релизной и профилировочной.

Лучше, если эти каталоги располагаются уровнем выше исходных текстов, дабы не засорять исходники мусором, генерируемым компилятором в папках build-*. Поэтому мы и создали дерево проекта именно таким образом, чтобы выполнить это условие. Указываем необходимые пути (как показано на скриншоте выше) и жмем кнопку «Настроить проект». После чего мы попадем в основное рабочее пространство проекта — редактор кода

Пишем сценарий сборки проекта

Щеклаем мышкой по файлу simple-loco.pro, он открывается в редакторе, куда мы вбиваем следующий заклинания

Разберем подробнее этот сценарий. Первая строка с директивой TEMPLATE указывает на тип проекта, в нашем случае это динамическая библиотека (DLL).

Следующие две директивы указывают, какие библиотеки Qt мы включаем, а какие исключаем из нашего проекта. Поскольку нам не нужен никакой графический интерфейс, мы убираем все связанные с ним библиотеки, зато добавляем библиотеки для работы с XML — симулятор и локомотивы для него активно используют этот формат в качестве конфигурационных файлов.

Далее мы указываем имя DLL, которое должно получится после сборки проекта в параметре TARGET, а так же тот путь, по которому следует собрать библиотеку в параметре DESTDIR. DLL назовем simple-loco, а вот для указания пути в каталог модулей симулятора, где должна лежать эта библиотека нам впервые пригодится системная переменная окружения RRS_ROOT, обращение к которой из QtCreator выглядит как конструкция $$(RRS_ROOT). Убедимся, что QtCreator видит эту переменную, заглянув в параметры системного окружения. Для этого жмем на левой панели инструментов кнопку «Проекты» и в появившемся окне открываем вкладку «Системная среда»

Отлично! Переменная есть и в данном случае равна пути C:\RRS (на вашем компьютере будет, возможно, по другому.

Далее, параметр $$join(TARGET,,,) сформирует имя каталога, совпадающее с именем DLL в каталоге модулей, таким образом каталог, по которому будет размещена DLL в рассматриваемом случае будет иметь путь C:\RRS\modules\simple-loco, что нам и требуется.

Следующая группа директив LIBS указывает какие библиотеки симулятора нам нужно компоновать с нашей DLL. Много кода, выполняющего рутинные операции вынесены в библиотеки расположенные в каталоге bin/. Без этих библиотек наша DLL будет неработоспособна. Обычно модуль подвижной единицы использует следующие DLL симулятора

  • CfgReader.dll — библиотека для работы с конфигурационными файлами XML;
  • physics.dll — библиотека, содержащая физические константы, такие как ускорение свободного падения, нормальное атмосферное давление и т.п., а так же ряд стандартных математических функций, облегчающих жизнь разработчика;
  • vehicle.dll — библиотека, реализующая модель подвижной единицы и дающая симулятору интерфейс для взаимодействия с модулями ПЕ;
  • device.dll — библиотека, обеспечивающая интерфейс к стандартным модулям оборудования, таким как краны машиниста, резервуары, токоприемники и т.п.;
  • filesystem.dll — диспетчер файловой системы, позволяющий быстро получить путь к любому каталогу внутри симулятора, а так же дающий функции для кроссплатформенной работы с путями.

Следующие директивы INCLUDEPATH необходимы для указания компилятору путей поиска заголовочных файлов, необходимых для сборки проекта. Нам нужны собственные заголовочные файлы нашей DLL и заголовочные файлы из папки sdk/include. Указываем пути к ним, применяя все ту же переменную RRS_ROOT.

Две последние директивы HEADERS и SOURCES необходимы, для того чтобы указать QtCreator, какие файлы включены в проект. Приведенная конструкция означает, что в состав проекта входят все файлы в каталоге include, имеющие расширение *.h в качестве заголовочных файлов, и все файлы в каталоге src с расширением *.cpp в качестве файлов исходных текстов.

Таким образом сценарий сборки готов и мы можем идти дальше.

Пишем код локомотива

Нам необходимо добавить два файла в наш проект — заголовочный и файл исходного кода. Щелкаем правой кнопкой по имени проекта слева и в появившемся меню выбираем «Добавить новый», и в получившемся диалоге выбираем тип имя заголовочного файла, а так же его расположение обязательно в папке include нашего проекта

Как видим, файл simple-loco.h появился в дереве проекта. Аналогичным образом добавляем файл simple-loco.cpp, только уже в каталог src

Следует обратить внимание на то, что несмотря на глобальные настройки включения файлов в проект, которые мы применяем в сценарии сборки, QtCreator не понимает свою же директиву $$files() и упрямо включает добавленные через мастер файлы в проект повторно

Это может привести к ошибкам в сборке, поэтому придется вручную привести наш файл pro к изначальному виду

Этому багу уже много лет и разработчики Qt не спешат его исправлять. Так что при применении «глобинга» приходится каждый раз править настройки проекта после добавления очередного класса или модуля в проект.

Итак, отредактируем заголовочный файл проекта, создав класс нашего локомотива

Вообще говоря, класс может называться совершенно произвольно — симулятор не знает и никогда не узнает имея этого класса. Симулятор умеет работать только с классом Vehicle, от которого наследуется класс нашего локомотива. Класс Vehicle используется динамическим движком игры для вызова методов класса нашего локомотива. Для создания работоспособного модуля ПЕ нам необходимо явно конструктор и деструктор класса, а так же создать функцию getVehicle(), которая видна из DLL симулятору и служит для создания экземпляра нашей подвижной единице в игре. Реализация методов традиционно выполняется в файле *.cpp

При реализации конструктора в обязательном порядке следует вызвать конструктор базового класса Vehicle — он выполняет много важной работы, сокрытой от разработчика локомотива, но принципиальной для движка симулятора. Конструктор и деструктор не будут выполнять пока никакой работы.

Отдельное внимание следует обратить на наличие макроса GET_VEHCILE(), который принимает имя нашего класса в качестве параметра. Этот макрос создает специальную функцию getVehicle(), которая должна присутствовать в DLL модуля ПЕ, чтобы симулятор смог сконструировать экземпляр этой ПЕ. Без нее мы получим сообщение о неудачной загрузке модуля ПЕ.

Ну вот, теперь выберем тип сборки «Выпуск» (внизу левой панели инструментов) кликнем правой кнопкой на имя проекта в дереве проекта и в появившемся меню нажимаем «Пересобрать».

Зеленая полоска в правом нижнем углу говорит нам о том, что DLL успешно собрана. И правда — заглянем в каталог modules/ и убедимся в этом сами

То есть мы успешно создали модуль DLL для нашего локомотива. Пусть он ничего пока не делает, но он обладает рядом характеристик, таких как масса, количество осей, реагирует на профиль пути и вообще уже может быть загружен в игру и включен в состав поезда.

Назад Вперед
Содержание