четверг, 3 ноября 2011 г.

Библиотека усатых шаблонов для C++

Появилась необходимость использовать шаблоны в своём (инди-)проекте на C++. Т.к. я работаю c CouchDB, мне очень привычно использовать Mustache. К счастью, этот замечательный и крайне быстрый шаблонизатор доступен практически для всех известных на сегодня языков программирования. C++ - известный язык :) и Mustache для него называется Plustache.

Я почему решил об этом написать? Потому что работаю с C++ уже полгода (не считаю себя классным специалистом, нет), успел его и возненавидеть, и полюбить. Порог входа в этот язык - довольно высок: шишок у начинающих C++ изучать - мама не горюй! И здесь речь не о первой программе типа  "Hello world!", хотя и это в C++ - уже достижение :) Собрать проект из исходного кода - то, без чего ни один серьёзный программист сегодня не выживет. И если человек не знает... нет, даже не основ, а (!) подноготной C++, изучение языка может замедлиться (ведь придётся писать и отлаживать свой велосипед) или даже остановиться. Надеюсь, описание процесса сборки проекта от "А" до "Я" поможет Вам в дальнейшем смело включать сторонние библиотеки в свои проекты.


Если бы Daniel Schauenberg - автор Plustache, огромное ему спасибо за труд! - попробовал собрать свой проект под Windows, он бы, наверное, внёс изменения в код. Хотя вряд ли: поддерживать несколько операционных систем - та ещё радость! Тем более, что проект - маленький и с лёгкостью переносится на любые ОС. Прекрасно подходит для обучения.

Итак, соберём Plustache как статическую библиотеку (*.lib) на MS Visual C++ 2010.


I. Получение исходного кода проекта.

Это самый простой этап. Зайдите на https://github.com/mrtazz/plustache, скачайте ZIP-архив проекта, распакуйте содержимое.


II. Подготовка проекта для VC++.

Не было бы печали, если бы rake работал под Windows также, как для OS X. Это не так. Хотя - клянусь! - я поставил для этой цели Ruby.


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

Выбираем в меню VC++ "Создать проект / Пустой проект "...


... и в свойствах проекта делаем след. изменения:
  • Общие / Тип конфигурации = "Статическая библиотека (.lib)"
  • C++ / Общие / Обрабатывать предупреждения как ошибки = "Да" или "Нет" (см. заметку ниже).

2. Копирование файлов.

VC++ поощряет создание проектов, которые заставят помучаться желающих скомпилировать их в другой IDE. Я говорю о файлах *.h и *.cpp, которые при создании из IDE VC++ бросаются в общую папку и т.н. "фильтрах", которыми VC++ мило позволяет пользоваться, но которые не являются папками файловой системы. Файлы Plustache лежат в папках "include", "src" и "tests". Можно пойти на поводу у Microsoft, но здесь вовсе не тот случай, когда мы вынуждены это делать. Поэтому
  1. Целиком скопируйте папки "include", "src" и "tests" в папку нашего проекта, воспользовавшись Проводником Windows.
  2. Добавим в VC++ / plustache файлы, (!) за исключением "main.cpp". Будем аккуратны: h-файлы поместим в "Заголовочные файлы", cpp-файлы - в "Файлы исходного кода".


3. Настройка проекта, разрешение зависимостей.

Настроек, сделаных в п.1, недостаточно для сборки, если проект имеет зависимости. Мало какой проект на C++ их не имеет. У Plustache зависимостей две:

Boost

За время изучения C++ я понял, что без Boost'а программиста ждёт безрадостное существование. Если Boost у Вас на компьютере ещё не установлен, сделайте это. Благо, создатели этого фреймворка пошли по пути упрощения и последние версии работают без компиляции. Вообще говоря, когда Вы начали серьёзно работать с C++, существует два ответа на вопрос "Нужно ли устанавливать Boost?": (а) да, сейчас; (б) да, позже.

(!) После установки Boost'а, убедитесь, что переменная окружения "BOOST_ROOT" - открываем Мой компьютер / Свойства / Дополнительно / Переменные среды - установлена и указывает на нужную папку. Например, это может быть папка "C:\boost_Версия".
Если внимательно следовали инструкции по установке, так оно и будет.

Заходим в свойства проекта Plustache и дорисовываем:
  • Каталоги VC++ / Каталоги включения / Изменить / Добавить = "$(BOOST_ROOT)"


GoogleTest

Если уже используете эту библиотеку unit-тестирования в других своих проектах (в Boost свой модуль тестирования тоже есть, но также есть жалобы, что библиотека на развивается) - просто добавьте пути к заголовочным файлам, как сделали выше для Boost'а.

Но для Plustache от GoogleTest можно отказаться. Библиотека используется в файлах папки "test". Поэтому просто не добавляйте эти файлы в проект.



4. Устранение ошибок компиляции.

Запускаем компиляцию.

Первая ошибка - компилятор VC++ 2010 не найдёт пути к некоторым своим же файлам включения (#include "include/*.hpp"). Можно  Устраняется в свойствах проекта:
  • Каталоги VC++ / Каталоги включения / Изменить / Добавить = "Путь к папке, где лежит проект". Например, такой > "D:\Projects\utils\plustache".

Опция "Обрабатывать предупреждения как ошибки" (см. выше) заставляет программиста писать более чистый, быстрый и надёжный код. Для больших библиотек устанавливать эту опцию - лишняя головная боль, т.к. свободный код программисты на Windows пишут редко. Иначе, почему в больших проектах количество предупреждений компилятора - зашкаливает!?

Т.к. Plustache - очень маленькая библиотека, ошибок много исправлять не придётся.

try {
    // ...
} catch ( int i ) {
    // ...
}
исправляем на
try {
    // ...
} catch ( ... ) {
    // ...
}
Компилятор покажет где.



В общем-то, на этом всё. Статическая библиотека plustache.lib создана (компилятор показывает путь, куда её положил) и готова к работе в других проектах под MS Windows. Благодаря тому, что Вы читали внимательно и не добавили в проект Visual C++ файл "main.cpp", не появится предупреждение LNK4006 при использовании plustache.lib в других проектах :)

Комментариев нет: