На этом уроке мы рассмотрим установку и настройку Code::Blocks в Linux для работы с OpenGL, а также запустим проект, рассмотренный на предыдущем уроке.
Подготовительные шаги
Установка будет происходить на чистой системе debian-10.3.0-amd64 XFCE под VMware. Я не буду описывать сам процесс установки ОС, ограничусь лишь скриншотом итоговой конфигурации системы:
Также для данного проекта я в домашней папке своего пользователя создал каталог OpenGL_Project
, полный путь к которому выглядит как /home/diego/OpenGL_Project/
, где diego
— это имя моего пользователя в системе. У вас оно наверняка будет другим. Учитывайте это!
На всякий случай избегайте кириллицы в путях и именах файлов.
Еще один момент: для установки новых пакетов в Linux я привык пользоваться программой aptitude
, а не стандартной apt-get
. Поэтому вы можете поступить следующим образом:
Вариант №1: Установить aptitude
, для этого в терминале выполните команду sudo apt-get install aptitude
.
Вариант №2: Можете пользоваться стандартной программой apt-get
. Но учтите, что если по ходу данного туториала встречается установка пакета командой вроде sudo aptitude install НАЗВАНИЕ_ПАКЕТА
, то в вашем варианте команда установки пакета должна выглядеть как sudo apt-get install НАЗВАНИЕ_ПАКЕТА
.
Установка GLFW в Linux
Скачиваем GLFW с оф. сайта:
Распаковываем скачанный архив в папку /home/diego/OpenGL_Project/
, я пользуюсь архиватором Xarchiver:
Указываем необходимую нам папку:
Видим получившуюся распакованную папку glfw-3.3.2
:
Установка CMake в Linux
Теперь необходимо поставить систему сборки проектов CMake. Для этого в окне терминала выполните следующую команду:
sudo aptitude install cmake-gui
Запускаем CMake:
Указываем папку с исходниками GLFW и вторую папку, где должен будет появиться результат работы CMake (у себя для этого я создал папку build
), и нажимаем кнопку "Configure"
:
В появившемся окне выбираем пункт "CodeBlocks – Unix Makefiles"
и нажимаем кнопку "Finish"
:
В результате видим… кучу ошибок (добро пожаловать в мир Linux):
Нажимаем "ОК"
, снова возвращаемся в терминал и устанавливаем пакет xorg-dev
:
sudo aptitude install xorg-dev
Возвращаемся в CMake и выставляем галочки так, как показано ниже:
И снова нажимаем кнопку "Configure"
(дважды), а потом кнопку "Generate"
. Видим сообщения об успешном конфигурировании и сборке проекта:
В результате, в папке build
у нас должен появиться файл проекта GLFW.cbp
:
Установка Code::Blocks в Linux
Пришло время установить среду программирования Code::Blocks. Для этого возвращаемся в терминал и вводим следующую команду:
sudo aptitude install codeblocks
После установки иконка файла проекта поменяет свой внешний вид:
Открываем данный файл, в результате чего будет запущен Code::Blocks, и появится окно с выбором компиляторов. В системе должен присутствовать как минимум один компилятор — GNU GCC Compiler
. Жмем "ОК"
:
Открывается окно проекта, нажимаем на шестеренку и компилируем его:
После этого в папке build/src
должен появиться скомпилированный файл библиотеки libglfw3.a
:
Установка GLAD в Linux
Заходим на оф. сайт GLAD и указываем следующие настройки, после чего нажимаем кнопку "Generate"
:
В результате нам будет предложено скачать архив glad.zip:
Далее, чтобы внести немного порядка и организованности в наш будущий проект, поместите папки include
и src
, содержащиеся в данном архиве, в папку /home/diego/OpenGL_Project/
.
Затем скопируйте папку /home/diego/OpenGL_Project/glfw-3.3.2/include/GLFW
в папку /home/diego/OpenGL_Project/include/
.
Также создайте папку lib
в /home/diego/OpenGL_Project/
и скопируйте в нее файл скомпилированной библиотеки libglfw3.a
.
В итоге у вас должна получиться примерно следующая картина иерархии папок и файлов:
Создание проекта в Code::Blocks
Запускаем Code::Blocks и создаем новый пустой проект: "File" > "New" > "Project…"
, выбираем "Empty Project"
и нажимаем кнопку "Go"
:
Затем нажимаем кнопку "Next"
:
Задаем имя проекту. Я назвал его CodeBlocks
и выбрал папку /home/diego/OpenGL_Project/
:
В следующем окне должны быть следующие настройки:
Теперь скопируйте файл glad.c
из папки /home/diego/OpenGL_Project/src/
в папку с проектом /home/diego/OpenGL_Project/CodeBlocks/
.
Также создайте файл main.cpp
в папке /home/diego/OpenGL_Project/CodeBlocks/
.
Затем эти два файла нужно будет добавить в наш проект. Для этого вернемся обратно в Code::Blocks, нажмем правой кнопкой мыши на название нашего проекта и выберем пункт "Add files…"
:
Добавляем в проект файлы glad.c
и main.cpp
:
Настало время подключить необходимые папки с заголовочными файлами и библиотеки, а также настроить компилятор и линкер. Для этого в Code::Blocks переходим в "Project" > "Build options…"
:
Переходим на вкладку "Linker settings"
и настраиваем её следующим образом:
Примечание: В правом окошке "Other linker options"
необходимо указать следующие параметры:
-lglfw3 -ldl -lX11 -lpthread -lm -lXrandr -lXi
Затем добавим дополнительные пути для поиска заголовочных и библиотечных файлов. Для этого переходим в "Search directories" > "Compiler"
:
Затем подобные действия проделываем и для вкладки "Linker"
, указывая путь к папке lib
:
Запускаем наш проект в Code::Blocks
Теперь откройте файл main.cpp
и скопируйте в него следующий код, рассмотренный на уроке №3:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
#include <glad/glad.h> #include <GLFW/glfw3.h> #include <iostream> void framebuffer_size_callback(GLFWwindow* window, int width, int height); void processInput(GLFWwindow *window); // Константы const unsigned int SCR_WIDTH = 800; const unsigned int SCR_HEIGHT = 600; int main() { // glfw: инициализация и конфигурирование glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // Раскомментируйте данную часть кода, если используете macOS /* #ifdef __APPLE__ glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); #endif */ // glfw: создание окна GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "OpenGL for Ravesli.com", NULL, NULL); if (window == NULL) { std::cout << "Failed to create GLFW window" << std::endl; glfwTerminate(); return -1; } glfwMakeContextCurrent(window); glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); // glad: загрузка всех указателей на OpenGL-функции if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { std::cout << "Failed to initialize GLAD" << std::endl; return -1; } // Цикл рендеринга while (!glfwWindowShouldClose(window)) { // Обработка ввода processInput(window); // Выполнение рендеринга glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); // glfw: обмен содержимым front- и back-буферов. Отслеживание событий ввода/вывода (была ли нажата/отпущена кнопка, перемещен курсор мыши и т.п.) glfwSwapBuffers(window); glfwPollEvents(); } // glfw: завершение, освобождение всех ранее задействованных GLFW-ресурсов glfwTerminate(); return 0; } // Обработка всех событий ввода: запрос GLFW о нажатии/отпускании клавиш на клавиатуре в текущем кадре и соответствующая обработка данных событий void processInput(GLFWwindow *window) { if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) glfwSetWindowShouldClose(window, true); } // glfw: всякий раз, когда изменяются размеры окна (пользователем или операционной системой), вызывается данная callback-функция void framebuffer_size_callback(GLFWwindow* window, int width, int height) { // Убеждаемся, что окно просмотра соответствует новым размерам окна. // Обратите внимание, высота окна на Retina-дисплеях будет значительно больше, чем указано в программе glViewport(0, 0, width, height); } |
Всё готово к тому, чтобы скомпилировать наш проект. Но мы же с вами используем Linux, и это было бы слишком просто. Если вы попробуете собрать текущий проект, то снова получите сообщения об ошибках. А чтобы избежать подобной ситуации, необходимо доустановить пакет g++
:
sudo aptitude install g++
Теперь можно нажать на шестерёнку и скомпилировать проект. Можно увидеть, как в папке bin/Debug/
создался исполняемый файл с названием CodeBlocks
:
Всё готово к запуску. Нажав на стрелочку, видим результат наших трудов — окно, залитое серо-зелено-голубым цветом. Именно так, как и было описано на уроке по созданию окна в OpenGL:
На этом всё! До следующего урока!
Имею такую ошибку в терминале:
"sh: 1: LD_LIBRARY_PATH=:.:../lib: not found
"
Что делать?
Всем доброго дня я знаю способ сделать это все намного быстрее.
Для начала нам нужно скачать необходимые пакеты слудующей командой в терминале:
sudo apt-get install libglfw3-dev libglfw3 libglew-dev libglew2.1 libglm-dev
(glm позже пригодится)
после этого создаем новый проект.
Далее переходим в:
Project->Build options->linker settings
и в "Other linker options" вводим:
-lGL -lGLEW -lglfw
Вам не нужно будет таскать с собой glad.c потому что в glew этого не надо, но подключение и инициплизация у glew отличаются от glad
подключение:
инициализация:
Если проект собирается, но не запускается, то перейдите в Settings->General Settings
и поменяйте "Terminal to launch console programs" на какой-нибудь
другой.
Всем удачи
У меня Code::Blocks на Manjaro (Arch) отказывался запускать даже "Hello world" — лечится путем подбора другой консоли в настройках: Settings->Environment->Terminal to launch programs: (Выбираем любую другую консоль, хотя бы одна из них должна заработать)
У меня arch, тоже не запустилось. Я прямм из консоли запускал. Спасибо за совет, сменил консоль, всё запустилось…
Вопрос — а зачем всё это мучение с CMake для GLFW? Можно просто поставить пакет glfw и использовать заголовочные файлы от него (в репозиториях большинства дистрибутивов версия > 3. Но во флагах gcc нужно указать не -lglfw3 а -lglfw.
Спасибо!
Но все заработало только тогда, когда я перешел в папку glfw-3.3.2/build и написал в терминале make
c кодблоком файл libglfw3.a не появлялся
Здравствуйте. А зачем ставить GLAD прямо в проект, почему не установить всё как динамическую библиотеку в /usr/local/lib и usr/local/include, чтобы можно было в любом проекте спокойно линковаться?
В Linux так делать не рекомендуется, так как в таком случае пакетный менеджер не знает о существовании данных файлов (но именно он всеми файлами здесь и управляет). А если будет несколько версий glad для разных проектов? Плюс не везде есть права суперпользователя, а для изменения папки /usr/* они нужны.
Потому, что glad генерировался именно для етого проекта
Работает!
Дмитрий Бушуев, огромное спасибо! 🙂
Пожалуйста 🙂