Компиляция с SDL

      Комментарии к записи Компиляция с SDL отключены

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 9 мес., 2 нед. назад.

  • Автор
    Сообщения
  • #3133
    Устанавливаем SDLСодержаниеУрок 1

    Давайте рассмотрим очень важный вопрос: как компилировать программы, использующие библиотеку SDL. Что касается компиляции под платформу, отличную от Linux, внимательно ознакомьтесь с документацией для этой платформы. Например, чтобы компилировать программы в среде Visual C++, прочтите файл VisualC.html, который находится в архиве для Visual Studio (см. http://www.libsdl.org). Еще я просто рекомендую прочитать SDL FAQ, который можно найти все на том же сайте. Пока я расскажу как компилировать программы для Linux.

    И так, мы будем использовать компилятор g++ (используйте gcc, если пишете на Си). Сначала рассмотрим все, что касается #include. При подключении заголовков SDL к программе (обычно они находятся в /usr/include/SDL) мы делаем так: #include "SDL.h". А потом указываем компилятору, где искать ненайденные заголовки (как вы помните, если заголовок в команде #include взят в кавычках, то он должен быть в текущей директории). Это нужно для переносимости программ, потому что не у всех заголовки будут лежать там же, где и у вас. При компиляции подставляем в качестве опции:
    -I/usr/include/SDL
    Или другой путь, если он у вас отличается от моего. Нам также нужно указать сами библиотеки, которые будем линковать к нашей программе, а также путь к этим библиотекам: -L/usr/lib указывает путь к библиотекам, а -lSDL линкует библиотеку libSDL.so к программе(опция -L указывает путь к библиотекам, а опция -l линкует библиотеку).

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

    #include "SDL.h"    
    #include <stdio.h> 
    
    int main() {
        
        printf("Initializing SDL.\n");
        
        if((SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO)==-1)) { 
            printf("Could not initialize SDL: %s.\n", SDL_GetError());
            exit(-1);
        }
    
        printf("SDL initialized.\n");
    
        printf("Quiting SDL.\n");
        
        SDL_Quit();
        
        printf("Quiting....\n");
    
        return 0;
    }

    Пример взят из SDL Documentation. Назовите его test.cxx и давайте попробуем его собрать.

    g++ -O3 -o test test.cxx -I/usr/include/SDL -L/usr/lib -lSDL

    Флаг -O3 задает уровень оптимизации (-O3 задает максимальный уровень, по умолчанию используется -O2).

    Флаг -o задает имя программы на выходе.
    Все остальное я уже рассказал. Но существует более элегантный способ задать флаги компиляции SDL. Просто выполните команду sdl-config --cflags --libs. Все необходимые для компиляции флаги SDL будут на выходе этой программы. То есть мы могли бы сделать так:
    g++ -O3 -o test test.cxx `sdl-config --cflags --libs`

    Где эту команду нужно поместить между знаков ` (это там где тильда ~).

    Если проект большой и состоит из многих файлов, то компилировать каждый неудобно и сложно. По этому приготовьтесь получить CRASH-курс по утилите make.

    Наверно не раз собирали какую-нибудь программу, набирая в консоли make. Согласитесь, это гораздо проще, чем компилировать каждый файл проекта примерно так же, как я показывал (см. выше). Чтобы работать с утилитой make, вы должны создать файл с именем "Makefile" в директории с проектом. Теперь возьмем пример простого make-файла для нашей тестовой программы, чтобы было легче разобраться:

    TARGET = test
    LIBS = `sdl-config --libs`
    CFLAGS = -O3 `sdl-config --cflags`
    CC = g++
    
    
    all:
    	$(CC) $(CFLAGS) -c test.cxx -o test.o
    	$(CC) -o $(TARGET) test.o $(LIBS)
    	strip $(TARGET)
    clean:
    	rm *.o 
    	rm $(TARGET)

    На первый взгляд немного сложно, но только на первый. И так, начнем по порядку. В верхней части мы задаем переменные: TARGET — имя программы на выходе, LIBS — какие библиотеки использовать, CFLAGS — уровень оптимизации и путь к заголовочным файлам библиотеки SDL, CC — имя выполняемого файла компилятора. Использовать переменные нужно так: $(ПЕРЕМЕННАЯ), т.е. заключать в круглые скобки и перед скобками ставить знак доллара. С переменными все ясно (надеюсь), теперь дальше: в make-файлах самое главное это так называемые цели (target). В нашем примере две цели — это all и clean. С новой строки мы пишем правила для сборки цели — команды, которые нам нужны. Не забудьте начинать каждую строку правил с нажатия кнопки TAB. Это обязательно. Если получите ошибку make-файла, то в первую очередь проверьте, расставлены ли знаки табуляции. Очень удобно в этом плане использовать редактор Midnight Commander, который подсвечивает табуляцию. В нашем случае мы сначала создаем object-файл, а потом программу. Строка
    $(CC) $(CFLAGS) -c test.cxx -o test.o
    эквивалентна
    g++ -O3 -I/usr/include/SDL -c test.cxx -o -test.o
    Опция компилятора -с указывает, что нужно пропустить финальную стадию компиляции (линковку), а создать только объектный файл. И следующая строка
    $(CC) -o $(TARGET) test.o $(LIBS)
    эквивалентна
    g++ -o test test.o -I/usr/lib -lSDL
    Пути могут отличаться в зависимости от системы. Команда strip оптимизирует исполняемый файл программы. Цель clean удаляет объектные файлы и запускаемый файл программы.

    Чтобы выполнить цель clean нужно выполнить команду make clean. Для выполнения цели all достаточно просто выполнить команду make. На самом деле синтаксис make-файлов гораздо обширнее и сложнее, но если овладеть им, то ваша жизнь облегчится во много раз. В интернете можно найти очень много информации по утилите make. Здесь я описал только самые основы, но с помощью таких же make-файлов мы и будем компилировать примеры из уроков.

    Устанавливаем SDLСодержаниеУрок 1

Для ответа в этой теме необходимо авторизоваться.