Сегодня мы познакомимся с библиотеками. А точнее, с библиотеками статичного связывания (static linked libraries).

Библиотеки статичного связывания предназначены для упрощения повторного использования кода. Сразу определимся, что же можно поместить в библиотеку. На данный момент у нас готово два класса, которые мы будем многократно использовать в будущих проектах. Это vector3 и DLinkedList. Сегодня мы создадим библиотеку: math.

Впоследствии, библиотеки, которые мы будем создавать на протяжении довольно длительного времени, составят основу игрового движка. В будущем к библиотекам math добавятся и другие: библиотеки для обработки физики, графики и конечно же библиотека для работы с сетью.

Создайте на жёстком диске папку libraries (где вам удобней). В ней создайте две папки: include и lib. В папке include будут храниться необходимые заголовочные файлы, а в lib - готовые библиотеки.

Ну чтож, приступим к созданию библиотек. Все библиотеки будут хранится в одном решении и у каждой будет свой проект. Создаём библиотеку math.

Создаём в Visual studio новый проект:
Фото

В окне Application settings (Настройки приложений) укажите, что создаётся статичная библиотека и уберите флажок (если он установлен) precompiled header:
Фото

Добавьте к проекту два файла: vector3.h и vector3.cpp

В файле vector3.h оставьте объявление класса и всех методов. В файл vector3.cpp поместите определение методов. Вот содержимое файлов: vector3.h и vector3.cpp

Вот в общем-то и всё. Компилируем библиотеку, но сначала нужно указать, чтобы компилировалась релизная версия. До сих пор для всех наших проектов мы делали только отладочные версии.
Фото

Откройте папку, где у вас лежит решение libraries. Из папки libraries/Release скопируйте файл math.lib (это и есть библиотечный файл) в lib, а из папки libraries/math скопируйте файл vector3.h в include. Напоминаю, что include и lib мы создали ранее.

Давайте проверим, что у нас получилось. Закройте решение libraries. Создайте какой-нибудь проект (можете использовать старый, где вы, я надеюсь, тестировали трёхмерные векторы) и добавьте к нему файл. Так как я хороший парень, то дам вам исходник программы, хотя вам должно быть стыдно за свою лень! Исходник тестовой программы. В программе используется несколько операций над векторами: присваивание, сравнение, нормирование, нахождение величины вектора. Скопируйте этот код в окно редактора.

Прежде всего, IDE нужно указать путь, где она сможет найти пользовательские (наши) бибилотеки. Открываем пункт меню Tools->Options (Сервис->Параметры). Переходим в узел VC++ Directories и указываем, где хранятся заголовочные и библиотечные файлы:
Фото
Фото

Закрываем это окно и открываем свойства проекта. Напоминаю, что сделать это можно, щёлкнув правой кнопкой на имени проекта в обозревателе решений и выбрав пункт Properties (Свойства). Не буду дальше описывать эти бесконечные пункты меню, всё ясно показано на следующей картинке:
Фото

Почти всё. Теперь нужно добавить в исходный код только одну строчку:

#include <vector3.h>
Обратите внимание, что используются угловые скобки, как при добавлений стандартных заголовочных файлов.

Контроль версий

К сожалению, так как мы ещё не разбирали программы управления версиями приложений, и классы ещё сырые (у нас ещё не хватает знаний, чтобы написать их правильно), то нам придётся самим управлять версиями библиотек.

Мы будем использовать довольно простой способ: в конец файлов будем добавлять окончание вида: _vX.Y где X, Y - номер версии. Если вам понадобится новая версия библиотек/заголовочных файлов/исходников, заходите в раздел Листинги и скачиваете нужную версию.

Если в коде встретится вот такое включение:

#include <vector3_v0.1.h>
То к проекту необходимо добавить библиотеку math_v0.1.lib

В большинстве случаев вы будете работать непосредственно с библиотеками. Но иногда вам понадобятся и исходники, например, если в новую версию библиотечного класса были добавлены новые возможности и вы хотите рассмотреть их более подробно.

Шаблонные классы
Шаблонные классы нельзя поместить в статичные библиотеки. Дело в том, что объявление класса и определение методов класса должны находиться в одном файле.

В стандарте C++ есть возможность объявления шаблонных классов и определения их методов в разных файлов. В стандарте для этого исопльзуется ключевое слово export. Но на данный момент компилятор встроенный в Visual C++ 2008 не поддерживает export.

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

#include <Graph_v0.7.h>
Здесь не нужно добавлять к проекту библиотечный файл, вам необходимо только удостовериться, что файл Graph_v0.7.h расположен в папке libraries\include. Если его там не окажется, то вам необходимо будет скачать его из раздела Листинги.

На сегодня всё.