SFML и Visual Studio

в 13:08, , рубрики: c++, game development, SFML, Visual Studio, документация, перевод

SFML и Visual Studio - 1

От переводчика: данная статья является первой в цикле переводов официального руководства по библиотеке SFML. Данный цикл статей ставит своей целью предоставить людям, не знающим язык оригинала, возможность ознакомится с этой библиотекой. Оригинал можно найти тут. Начнем.

Вступление

Эта статья — первая, которую вам следует прочитать, если вы используете среду разработки Visual Studio (Visual C++ compiler). В ней будет рассказано, как настроить ваш проект.

Установка SFML

Для начала вы должны скачать SFML SDK со страницы загрузки.

Вы должны скачать пакет, соответствующий вашей версии Visual C++. Например, библиотека, скомпилированная с помощью VC++ 10 (Visual Studio 2010) не будет совместима с VC++ 12 (Visual Studio 2013). Если вы не найдете на странице загрузки пакет SFML, скомпилированный для вашей версии Visual C++, вам придется собрать SFML самостоятельно.

Далее вы должны распаковать архив с SFML в любую удобную для вас директорию. Копировать заголовочные файлы и библиотеки в вашу установку Visual Studio не рекомендуется. Лучше держать библиотеки в отдельном месте, особенно если вы намереваетесь использовать несколько версий одной библиотеки или несколько компиляторов.

Создание и конфигурирование проекта SFML

Первое, что вам необходимо сделать — это выбрать тип создаваемого проекта: вы должны выбрать «Win32 application». Мастер предложит вам несколько опций для настройки проекта: выберите «Console application» в том случае, если вам нужна консоль, либо «Windows application», если она вам не нужна. Выберите «Empty project» если вам не нужен автоматически сгенерированный код.

Создайте файл main.cpp и добавьте его в проект. Этим вы примените настройки C++ (в противном случае Visual Studio не будет знать, какой язык мы будем использовать для данного проекта). Содержимое файла main.cpp будет приведено ниже.

Теперь вам необходимо указать компилятору где искать заголовочные файлы (файлы с расширением .hpp) и компоновщику где искать библиотеки SFML (файлы с расширением .lib).

Добавьте в свойства проекта следующее:

  • Путь до заголовочных файлов SFML (<путь-к-установке-SFML>/include) в C/C++ » General » Additional Include Directories.
  • Путь до библиотек SFML (<путь-к-установке-SFML>/lib) в Linker » General » Additional Library Directories.

Эти пути совпадают для конфигураций Debug и Release, так что вы можете установить их глобально для вашего проекта («All configurations»).

SFML и Visual Studio - 2

Следующий шаг — компоновка вашего приложения с библиотеками SFML (файлы с расширением .lib). SFML состоит из пяти модулей (system, window, graphics, network и audio) и библиотек для каждого из них. Библиотеки должны быть добавлены в свойства проекта в Linker » Input » Additional Dependencies. Добавьте те библиотеки SFML, в которых вы нуждаетесь, например «sfml-graphics.lib», «sfml-window.lib» и «sfml-system.lib».

Важно указать библиотеки, соответствующие конфигурации: «sfml-xxx-d.lib» для Debug и «sfml-xxx.lib» для Release, иначе могут возникнуть ошибки.

Настройки, приведенные выше, позволят вам скомпоновать ваш проект с динамической версией SFML, для которой требуются DLL файлы. Если вы хотите напрямую интегрировать SFML в ваш исполняемый файл, а не использовать компоновку с динамической библиотекой, вы должны скомпоновать статическую версию библиотеки. Статические библиотеки SFML имеют суффикс "-s": «sfml-xxx-s-d.lib» для конфигурации Debug и «sfml-xxx-s.lib» для Release.

Так же вам необходимо определить макрос SFML_STATIC в опциях препроцессора вашего проекта.

SFML и Visual Studio - 3

Начиная с SFML 2.2 при статической компоновке вам так же необходимо скомпоновать все зависимости SFML. Это означает, что если, к примеру, вы скомпонуете sfml-window-s.lib или sfml-window-s-d.lib, вам так же придется скомпоновать opengl32.lib, winmm.lib и gdi32.lib. Некоторые из этих библиотек, возможно, уже перечислены в разделе «Inherited values», но добавление их не должно вызвать каких либо проблем.

В таблице ниже представлены зависимости для каждого модуля, добавьте -d если вы хотите скомпоновать Debug библиотеки SFML.

Модуль Зависимости
sfml-graphics-s.lib
  • sfml-window-s.lib
  • sfml-system-s.lib
  • opengl32.lib
  • freetype.lib
  • jpeg.lib
sfml-window-s.lib
  • sfml-system-s.lib
  • opengl32.lib
  • winmm.lib
  • gdi32.lib
sfml-audio-s.lib
  • sfml-system-s.lib
  • openal32.lib
  • flac.lib
  • vorbisenc.lib
  • vorbisfile.lib
  • vorbis.lib
  • ogg.lib
sfml-network-s.lib
  • sfml-system-s.lib
  • ws2_32.lib
sfml-system-s.lib
  • winmm.lib

Из таблицы вы могли заметить, что одни модули SFML могут зависить от других, например, sfml-graphics-s.lib зависит от sfml-window-s.lib и sfml-system-s.lib. Если вы производите статическую компоновку библиотеки SFML, будьте уверены, что все зависимости из цепочки зависимостей были удовлетворены. Если одна из зависимостей отсутствует, вы получите ошибку компоновщика.

Если вы немного запутались, не волнуйтесь, для начинающего совершенно нормально быть перегруженным всей этой информацией о статическом связывании.Если у вас что-то не получится с первого раза, вы можете попробовать еще раз имея в виду все сказанное выше. Если у вас все же возникнут трудности со статическим связыванием, вы можете попробовать поискать решение в разделе FAQ или на форуме.

Если вы не знаете чем отличаются динамические (так же называемые общими) и статические библиотеки и какой тип библиотек использовать, вы можете найти больше информации в интернете. На данную тему есть множество хороших статей/блогов/постов.

Ваш проект готов, давайте напишем немного кода что бы проверить, что все работает правильно. Поместите следующий код в файл main.cpp:

#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
    sf::CircleShape shape(100.f);
    shape.setFillColor(sf::Color::Green);

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear();
        window.draw(shape);
        window.display();
    }

    return 0;
}

Если при создании проекта вы выбрали опцию «Windows application», то точкой входа в вашу программу должна быть функция «WinMain» вместо «main». Так как это специфика Windows, ваш код не будет компилироваться на Linux или Mac OS X. SFML предоставляет способ сохранить стандартной точкой входа «main» в том случае, если вы скомпонуете свой проект с модулем sfml-main («sfml-main-d.lib» для Debug, «sfml-main.lib» для Release) таким же способом, которым вы скомпоновали sfml-graphics, sfml-window и sfml-system.

Теперь скомпилируйте проект, и, если вы скомпоновали вашу программу с динамической версией SFML, не забудьте скопировать файлы с расширением .DLL (они расположены в <путь-к-установке-SFML>/bin) в директорию, в которой расположен исполняемый файл вашей программы. Запустите программу, и, если все было сделано правильно вы должны увидеть это:

SFML и Visual Studio - 4

Если вы используете модуль sfml-audio (независимо от того, статическую или динамическую его версию), вы так же должны скопировать внешнюю dll библиотеку OpenAL32.dll. Этот файл так же может быть найден в директории <путь-к-установке-SFML>/bin.

Автор: HighMem

Источник

Поделиться новостью

* - обязательные к заполнению поля