GLFW + GLAD = OpenGL графика с шейдерами
Здравствуйте, как давно меня здесь не было. Наверное не было ещё такой темы ради которой стоило бы Вас, дорогие читатели моих опусов, беспокоить.
Решил я познакомится поближе с OpenGL. Единственный доступный инструмент для написания программ и их компиляции, оказался NetBeans IDE 8.2, установочный файл netbeans-8.2-windows.exe размером 225 472 кб. и jdk-8u144-windows-x64 установочный файл jdk-8u144-windows-x64.exe размером 202 523 кб.
Размеры файлов и названия пишу точно, поскольку их размер зависит от их комплектации, а комплектация, насколько могу быть точным от конечной функциональности. После установки получаем вот такой инструмент разработки:


Использую компилятор CLang. Все инструменты скачаны при помощи утилиты MSYS которую можно скачать по ссылке https://www.msys2.org. Упор был сделан на инструменты UCRT64. MinGW не пользуюсь совсем.
Об инструментах поговорили и перейдём к OpenGL.
Проблема состояла в том, как тот код, который из интернета, запихать в конструкцию из GLFW + GLAD и получить OpenGL графику с шейдерами.
Первая проблема была с тем, как инициализировать GLAD? С glad.h проблем не было, а вот с glad.c возникли. Поиски решения оказались успешными и её реализацию вы увидите в коде, который я приведу ниже.
Вторая проблема в том, что часто можно увидеть конструкцию GLFW+GLEW, но я от неё отказался поскольку хотел реализовать конструкцию GLFW+GLAD.
Третья проблема, что везде в «туториалах» даётся множество примеров, которые отвязаны от цельного кода, куда писать, как встраивать код в программу, где искать дополнительные файлы, не понятно.
Я новичок в программировании, поэтому пишу с позиции именно новичка, так что не нападайте 🙂
//#define GLAD_GL_IMPLEMENTATION #include #include #define GLFW_INCLUDE_NONE #include #include #include #include #include using namespace std; //GLFWwindow *window; static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) < if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) glfwSetWindowShouldClose(window, GLFW_TRUE); switch (key) < case GLFW_KEY_ESCAPE: glfwSetWindowShouldClose(window, GLFW_TRUE); break; /* case GLFW_KEY_SPACE: cur_icon_color = (cur_icon_color + 1) % 5; set_icon(window, cur_icon_color); break; case GLFW_KEY_X: glfwSetWindowIcon(window, 0, NULL); break;*/ >> void triang() < GLuint vbo = 0; GLuint vao = 0; float points[] = < 0.0f, 0.5f, 0.0f, 0.5f, -0.5f, 0.0f, -0.5f, -0.5f, 0.0f >; const char* vertex_shader = "#version 400\n" "in vec3 vp;" "void main() "; const char* fragment_shader = "#version 400\n" "out vec4 frag_colour;" "void main() "; GLuint vs = glCreateShader(GL_VERTEX_SHADER); GLuint fs = glCreateShader(GL_FRAGMENT_SHADER); GLuint shader_programme = glCreateProgram(); glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, 9 * sizeof(float), points, GL_STATIC_DRAW); glGenVertexArrays(1, &vao); glBindVertexArray(vao); glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, vbo); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); glShaderSource(vs, 1, &vertex_shader, NULL); glCompileShader(vs); glShaderSource(fs, 1, &fragment_shader, NULL); glCompileShader(fs); glAttachShader(shader_programme, fs); glAttachShader(shader_programme, vs); glLinkProgram(shader_programme); glUseProgram(shader_programme); glBindVertexArray(vao); // draw points 0-3 from the currently bound VAO with current in-use shader glDrawArrays(GL_TRIANGLES, 0, 3); // update other events like input handling > // Когда пользователь меняет размер окна, окно просмотра также должно быть скорректировано, требуя функцию обратного вызова void framebuffer_size_callback(GLFWwindow* window,int width,int height) < // Первые два параметра функции glViewport управляют положением нижнего левого угла окна, а третий и четвертый параметры контролируют ширину и высоту окна рендеринга glfwSetKeyCallback(window, key_callback); glfwGetFramebufferSize(window, &width, &height); glViewport(0,0,width,height); >// Объявляем функцию, чтобы определить, нажата ли конкретная клавиша void processInput(GLFWwindow * window) < // Проверка, нажимает ли пользователь клавишу возврата (Esc) (если не нажата, glfwGetKey вернет GLFW_RELEASE, если нажата, GLFW_PRESS) if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) < glfwSetWindowShouldClose(window, true); >> int main(int argc, char** argv) < // Инициализация GLFW glfwInit(); // Установить номер основной версии OpenGL (Major) и номер вспомогательной версии (Minor) в 3 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); // Использование режима ядра (Core-profile) glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // Если это система MacOS, вам понадобится следующая строка кода для работы конфигурации //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // Создать объект окна GLFWwindow * window = glfwCreateWindow(800, 600, "GLFW + GLAD", NULL, NULL); if (window == NULL)< cout // Уведомить GLFW, чтобы установить контекст нашего окна в качестве основного контекста текущего потока glfwMakeContextCurrent(window); // GLAD используется для управления указателем функции OpenGL, нам нужно инициализировать GLAD перед вызовом любой функции OpenGL if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) < cout // Зарегистрируем определенную функцию обратного вызова и сообщаем GLFW вызывать эту функцию при каждом изменении размера окна glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); // Визуализация цикла while (!glfwWindowShouldClose(window)) < // Проверить, нажата ли конкретная клавиша, и обрабатывать ее каждый кадр processInput(window); // функция glClearColor - это функция установки состояния, используемая для установки цвета, используемого для очистки экрана glClearColor(0.2f,0.3f,0.3f,1.0f); // Функция glClear - это функция использования состояния, которая использует текущее состояние для очистки экрана с указанным цветом glClear(GL_COLOR_BUFFER_BIT); //triang(); - запускаем отрисовку треугольника. Работает именно в этом месте! triang(); // Функция glfwSwapBuffers будет обмениваться цветовыми буферами glfwSwapBuffers(window); // Функция glfwPollEvents проверяет, запущены ли какие-либо события glfwPollEvents(); >// Освободить все ресурсы, выделенные ранее glfwTerminate(); return 0; >
результат работы программы:
В этом коде я собрал много разных идей, здесь нет ни чего моего, кроме компоновки кода.

Да. Программа не ахти какая, но как видно из примера, работать в этой конструкции можно и вполне себе успешно. Можно выдернуть код, удалив всего одну функцию не разрушив целость структуры и так же вставить другой код. Какие перспективы у данной реализации? Наверно ограничиваются только фантазией.
Всем творческих успехов.
Может ли GLAD загрузить функции OpenGL из dll файла?
. И почему-то OpenGL функции не загружаются при таком способе. Однако, если я перенесу функцию «gladLoadGLLoader» в «main» функцию (откуда я и использую этот dll), то все ок. Если честно, то у меня есть только одно предположение почему так происходит. Вроде функция «gladLoadGLLoader» загружает указатели на OpenGL функции в память, а так как загрузка происходила в dll, то об этих загруженных функциях знает только эта dll. Это так? Если нет, то хотелось бы знать, какой правильный ответ
Отслеживать
задан 30 авг в 17:14
49 7 7 бронзовых знаков
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
так как загрузка происходила в dll, то об этих загруженных функциях знает только эта dll. Это так?
Да. Может быть можно что-то нашаманить, чтобы они грузились сразу на все DLL (собрать GLAD как динамическую библиотеку?), но мы решили вот так: (писать в хедере)
inline void LoadGL() < [[maybe_unused]] static const std::nullptr_t once = []< gladLoadGLLoader(. ); return nullptr; >(); >
И вызывать эту функцию перед манипуляциями с OpenGL. Первый вызов в каждой отдельной DLL вызовет лямбду, а следующие не будут ничего делать.
Отслеживать
ответ дан 31 авг в 3:34
HolyBlackCat HolyBlackCat
26.4k 3 3 золотых знака 27 27 серебряных знаков 39 39 бронзовых знаков
Хорошо, спасибо за ответ
31 авг в 13:41
так как загрузка происходила в dll, то об этих загруженных функциях знает только эта dll. Это так?
Нет. Все отресовленные GLAD функции становятся доступны для всего процесса. Другое дело, что если использовать GLAD, линкуя его в виде статической библиотеки, либо, еще хуже, как то часто советуют, прямо собирать glad.c вместе с файлами своего проекта, то в программе окажется два набора глобальных переменных, которые GLAD заполняет указателями на соотв. функции — один набор виден в единицах трансляции, составляющих .exe, а другой — в единицах трансляции, составляющих .dll. Ну и вызов gladLoadGLLoader будет инициализировать только тот набор, который виден в месте вызова.
¿Что делать? По-хорошему, отказываться от GLAD и прочих динамических загрузчиков и линковать нужные библиотеки, как обычно. На самом деле это не всегда возможно, но стоит использовать более адекватный загрузчик, не плодящий глобальные переменные, и не прячущий их потом за макросами.
learnopengl. Урок 1.2 — Создание окна

В прошлом уроке мы разобрались с тем, что такое OpenGL. В этом уроке мы поговорим о причине необходимости использования GLFW, GLEW и CMake, а также рассмотрим как их использовать. А также освежим в памяти, разницу между статической и динамической линковкой.
Заинтересовавшихся прошу под кат.
Содержание
- Цвета
- Основы освещения
- Материалы
- Текстурные карты
- Источники света
- Несколько источников освещения
- Библиотека Assimp
- Класс полигональной сетки Mesh
- Класс 3D-модели
- Тест глубины
- Тест трафарета
- Смешивание цветов
- Отсечение граней
- Кадровый буфер
- Кубические карты
- Продвинутая работа с данными
- Продвинутый GLSL
- Геометричечкий шейдер
- Инстансинг
- Сглаживание
- Продвинутое освещение. Модель Блинна-Фонга.
- Гамма-коррекция
- Карты теней
- Всенаправленные карты теней
Часть 1.2 — Создание окна
Прежде чем начать создавать умопомрочительную графику нам надо создать контекст и окно приложения, в котором мы будет эту графику рисовать. Но, к сожалению, эти операции специфичны для каждой операционной системы и OpenGL всеми силами старается абстрагироваться от этих операций. Это означает, что создавать окно, определять контекст и работать с пользовательским вводом нам придется самим.
GLFW
GLFW — это библиотека, написанная на C, специально нацеленная для предоставления OpenGL самого необходимого для отрисовки контента на экран. Она позволяет нам создать контекст, определить параметры окна и работать с пользовательским вводом, а это все что там сейчас нужно.
В основном в этом и следующем уроке мы будем заставлять GLFW нормально работать, проверять правильность создания OpenGL контекста и производить отрисовку окна в котором мы будет рисовать графику. Этот урок пошагово расскажет о сборке и линковке GLFW библиотеки. Для этого урока мы будем использовать Microsoft Visual Studio 2012 (заметьте, что процесс будет мало отличаться для других версий VS). Если вы не используете VS — то не волнуйтесь, этот процесс очень похож для всех IDE.
Сборка GLFW
GLFW можно скачать со страницы загрузки официального сайта. GLFW поставляется с прекомпилированными бинарниками и заголовочными файлами для VS, но для полноты картины мы соберем GLFW собственноручно. Так что давайте скачаем пакет с исходным кодом (Source package).
Если вы используете прекомпилированные бинарники — удостоверьтесь, что вы скачали 32 битную версию, а не 64 битную. (Если вы не знаете в чем существенная разница). Так как 64 битная версия генерирует довольно странное поведение для большинства читателей.
После того, как вы скачаете пакет — разархивируйте его. Нам интересны следующие элементы:
- Результат компиляции
- Папка include
CMake
CMake — это инструмент для генерации файлов Проекта/Решения для IDE, выбранного пользователем (Visual Studio, Code::Blocks, Eclipse) из набора исходных кодов и CMake скриптов. Такая конфигурация позволяет сгенерировать Visual Studio 2012 проектные файлы, чтобы мы могли без труда собрать библиотеку. Для начала нам надо скачать CMake, сделать это можно на странице загрузки. Я использую Win32 установщик.
Как только CMake установится, вы сможете выбрать запуск CMake из консоли или в качестве графического приложения. Так как мы стараемся не перегружать уроки — то мы выберем графическое приложение. CMake требует указать директорию с исходным кодом и папку, куда будет записан результат в виде бинарных файлов. В качества директории с исходным кодом мы укажем корневую папку разархивированного GLFW пакета с исходным кодом, а в качестве папки для бинарных файлов мы укажем новую директорию .

После установки требуемых директорий, нажмите Configure, что бы CMake считал требуемые настройки и исходный код. Затем нам требуется выбрать генератор для проекта. Так как мы собираемся использовать Visual Studio 2012 мы выбираем Visual Studio 11 (Visual Studio 2012 также известна как Visual Studio 11). Далее CMake отобразит возможные настройки сборки, их можно оставить без изменения, нажав еще раз на Configure для их сохранения. После сохранения настроек можем приступать к генерации проекта, для этого нажмите на Generate и в папке build будут созданы файлы проекта.
Компиляция
В папке build появился файл GLFW.sln, открываем его Visual Studio. CMake должен был сгенерировать проект со всеми требуемыми настройками, поэтому просто начинаем сборку, нажимая на Build Solution и в качестве результата мы получае glfw3.lib (мы используем 3 версию) в папке src/Debug,
После того, как библиотека сгенерировалась надо удостовериться, что IDE знает где искать библиотеку и заголовочные файлы. Есть 2 способа сделать это:
-
Мы ищем /lib и /include папки IDE или Компилятора и добавляем туда папку include и libиз GLFW. Это будет работать, но так лучше не делать. Такой метод сложно отследить и вы потеряете все файлы при переустановке или смене компилятора/IDE.
Наш первый проект
Для начала давайте откроем Visual Studio и создадим новый проект. Выберите Visual C++ и Пустой проект (не забудьте выдать проекту приемлемое имя). Теперь у нас есть рабочее пространство для создания нашего первого приложения с использованием OpenGL.
Линковка
Для использования GLFW нам также требуется его связать с нашим проектом. Это делаеться, указанием, что мы хотим использовать glfw3.lib в настройках линковщика, но наш проект все еще не знает, где искать glfw3.lib (если вы не выбрали 1 вариант во время решения проблемы с местонахождением файлов библиотек), соответственно нам надо добавить эти директории в проект.
Мы можем добавить те директории, для этого перейдите в VC++ Directories, как показано на изображении ниже:

И оттуда вы можете добавить собственные директории, чтобы проект знал где искать требуемые файлы. Это можно сделать ручным способом, просто вставив путь в текстовое поле, либо нажав на Edit…, где вы сможете добавить значения в специальном окне.

Здесь вы можете добавить такое количество директорий, какое вам захочется, а IDE также будет искать требуемые файлы там. Теперь, когда Include папка указана для среды вы сможете найти все требуемые заголовочные файлы GLFW в . Тоже самое применимо и для директории с библиотеками.
И уже после того, как Visual Studio узнал, где искать требуемые библиотеки, мы наконец можем связать GLFW и наш проект:

Здесь требуется указать название линкуемой библиотеки, в нашем случае это glfw3.lib и добавляем мы ее в поле Additional Dependencies (сделать это также можно изменив руками или использовав кнопку ) и теперь GLFW будет линковаться к проекту во время компиляции. Также требуется указать OpenGL библиотеки, но этот процесс отличается для разных ОС.
OpenGL библиотека для Windows
Если вы используете Windows — то библиотека, называющаяся opengl32.lib поставляется с Microsoft SDK, которая ставится по умолчанию при установке Visual Studio. Так как в этом уроке мы и так использует Visual Studio — то здесь будет достаточно просто добавить opengl32.lib в настройки линковщика.
OpenGL библиотека для Linux
На Linux системах вам требуется использовать libGL.so библиотеку, использовав флаг -lGL в настройках линковщика. Если вы не можете найти эту библиотеку — то вам, вероятно, требуется поставить Mesa, NVidia или AMD dev пакеты, но я не буду вдаваться в подробности, так как это очень специфично для платформы (плюс я не являюсь Linux экспертом).
По окончанию добавления GLFW и OpenGL библиотеки в настройки линковщика вы можете подключать GLFW следующим образом:
#include
Это финальный этап установки и настройки OpenGL.
GLEW
Но мы еще не закончили с настройкой OpenGL. Кое что еще придется сделать. Поскольку OpenGL — это лишь спецификация — то реализация ложится на плечи разработчиков видеокарт. По этой причине, поскольку существует множество реализаций OpenGL реальное расположение OpenGL функций не доступно на этапе компиляции и их приходится получать на этапе исполнения. Фактически получение адресов функций ложится на плечи программиста. Процесс получения адресов специфичес для каждой платформы, для Windows это выглядит примерно так:
// Определяем прототип функции typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*); // Находим эту функцию в реализации и сохраняем указатель на нее GL_GENBUFFERS glGenBuffers = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers"); // Теперь мы можем нормально вызвать эту функцию GLuint buffer; glGenBuffers(1, &buffer);
Как вы можете заметить код выглядит довольно запутанным, а необходимость производить получение адреса для каждой OpenGL функции делает этот процесс просто мучительным. Но к счастью существуют библиотеки реализующие эту динамическую линковку и одной из самых популярных библиотек является GLEW
Сборка и линковка GLEW
GLEW расшифровывается как OpenGL Extension Wrangler Library и управляем всей той громоздкой работой о которой говорилось выше. Поскольку GLEW это тоже библиотека — то нам опять придется собрать ее и связать с нашим проектом. GLEW может быть скачан с официальной страницы, там вы найдете как уже прекомпилированные библиотеки, так и исходный код. И опять же повторюсь: если вы не уверены какую битность использовать — используйте 32 битную версию.
Мы будем использовать статическую версию GLEW, которая называется glew32s.lib (заметьте приставку `s`). Поэтому добавьте ее в вашу папку с библиотеками, а также добавьте заголовочные файлы в вашу папку с заголовочными файлами. Теперь мы можем линкануть GLEW к проекту, добавив glew32s.lib в настройки линковщика в Visual Studio. Заметьте, что GLFW3 по умолчанию собирается как статическая библиотека.
Статическая линковка означает, что библиотека будет интегрирована с исполняемым файлом во время компиляции. Преимущество такого подхода в том, что вам не нужно следить за дополнительными файлами, помимо исполняемого файла. Недостатки такого подхода состоят в том, что исполняемый файл увеличивается в размерах и что при обновлении библиотеки вы вынуждены пересобирать исполняемый файл.
Динамическая линковка осуществляется посредством .dll и .so файлов, осуществляя разделение кода библиотеки и кода приложения, уменьшая размер исполняемого файла и упрощая обновление библиотеки. Недостатком такого подхода является тот факт, что вам придется выпускать DLL файлы вместе с финальным приложением.
Если вы хотите использовать GLEW как статическую библиотеку — то перед подключением GLEW следует задать переменную препроцессора GLEW_STATIC.
#define GLEW_STATIC #include
Если вы хотите динамическое связывание — то вы можете опустить задачу переменной препроцессора GLEW_STATIC. Помните, что если вы используете динамическое связывание то вам придется скопировать .DLL файл в папку с исполняемым файлом.
Для пользователей Linux, собирающих проект с помощью GCC в сборке могут помочь следующие ключи:
-lGLEW -lglfw3 -lGL -lX11 -lpthread -lXrandr -lXi.
Неправильное использование данных ключей может привести к большому количеству неопределенного поведения.
Теперь, когда мы наконец то собрали и связали GLFW и GLEW у нас все готово для следующего урока в котором мы обсудим как использовать GLFW и GLEW для настройки OpenGL контекста и создания окна. Удостоверьтесь, что ваши директории с заголовочными файлами и файлами библиотек указаны верно и что в названиях библиотек в настройках линковщика нет ошибок. Если вы застряли — проверьте комментарии к исходной статье или другие источники, возможно вы допустили некоторую специфическую ошибку.
Дополнительные ресурсы
- Сборка приложений: предоставляет подробную информацию о процессе линковки и компиляции приложения с большим количеством различных возможных ошибок;
- GLFW с Code::Blocks: сборка GLFW в Code::Blocks IDE;
- Запуск CMake: небольшой урок о запуске CMake под Windows и Linux;
- Написание сборочной системы под Linux: урок по autotools от Wouter Verholds описывающий процесс написания системы сборки в Linux специально настроенных для этих уроков;
- Polytonic/Glitter: простой шаблонный проект, который поставляется пред-настроенным со всемы требуемыми библиотеками; идеален, если вы хотите увидеть пример полностью работающего LearnOpenGL проекта.
Подключение Glad
Пытаюсь подключить и заставить работать Glad, но что-то не выходит. Вообще, возможно ли сделать так, чтобы glad.c находился не в папке с проектом а в отдельной папке для glad, там же где и glad.h?
Лучшие ответы ( 2 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Проблема с GLAD
Проблема на скриншоте
Проблемы с glad
С gl.h всё работает, как только подключаю glad — вылетает такая ошибка. В чём проблема? Ошибка.

Почему GLAD крашится?
Юзаю связку GLFW + GLAD, CLion, Linux-mint, С++. Всё работало хорошо, но в один прекрасный день.

Не удаются подключить библиотеку GLAD
Ку всем Использую QTCreator. Подключил GLFD. При попытке попытке подключить GLAD выдаёт ошибки.

GLAD для Linux без привязки к IDE
Мне необходимо установить glad, так чтобы я мог компилировать проекты с glad через консоль, и какие.
Регистрация: 14.08.2019
Сообщений: 724
Сгенерировал header-only версию glad здесь, подключил, все равно unresolved external symbol.. Боже, почему нельзя сделать по нормальному, чтобы просто подключить заголовок и пользоваться без сношения с ошибками. ПИЧОТ.
Добавлено через 2 минуты
Очень ПИЧОТ. Максимально. Кому яичницу?
Добавлено через 13 минут
zayats80888 пожалуйста, помоги!
![]()
2484 / 1037 / 354
Регистрация: 11.08.2017
Сообщений: 3,184
eXpl01TeR, А что мешает собрать из глада библиотеку? Хотя проблема надуманная, чего ненормального в добавлении в проект еще одного файла?
5993 / 3375 / 1374
Регистрация: 07.02.2019
Сообщений: 8,530

Сообщение было отмечено eXpl01TeR как решение
Решение
Сообщение от eXpl01TeR 
Сгенерировал header-only версию glad здесь, подключил, все равно unresolved external symbol..
В каком нибудь одном (и только в одном) cpp файле перед включением glad.h задефайнь #define GLAD_GL_IMPLEMENTATION
Регистрация: 14.08.2019
Сообщений: 724
zayats80888, А что это делает?
Добавлено через 1 минуту
Сообщение от alecss131 
А что мешает собрать из глада библиотеку?
Я не знаю как это сделать
5993 / 3375 / 1374
Регистрация: 07.02.2019
Сообщений: 8,530
Сообщение от eXpl01TeR 
А что это делает?
Это включит реализацию в этот cpp файл («пришьёт» к нему условный glad.c).
5146 / 2759 / 464
Регистрация: 05.10.2013
Сообщений: 7,281
Записей в блоге: 145

Сообщение было отмечено eXpl01TeR как решение
Решение
Сообщение от eXpl01TeR 
Вообще, возможно ли сделать так, чтобы glad.c находился не в папке с проектом а в отдельной папке для glad, там же где и glad.h?
Обратите внимание, что в папке с исходниками GLAD (https://github.com/Dav1dde/glad) имеется файл CMakeLists.txt. Это значит, что GLAD можно собрать в статическую библиотеку с помощью CMake. Я все библиотеку храню в одной папке и подключаю их к каждому проекту. Я собирал GLAD с помощью CMake GUI. Если ни разу не пользовались CMake GUI, то покажу, как это делать, это очень просто.
В первой строке указываете, где исходники, а во второй — папку, где будет создана библиотека:
Нажимаете кнопку Configure. Появляется окно, где нужно выбрать компилятор для сборки библиотеки — я использую MinGW, (а вы можете использовать, например, компилятор из VS):
После конфигурирования появятся настройки, где ничего менять не нужно:
Нужно опять нажать Configure, чтобы подтвердить настройки. К слову сказать, если бы мы что-то меняли, то нужно было бы, после установки или снятия каких-либо галочек, опять нажать Configure, чтобы подтвердить настройки. Далее, нажимаем кнопку Generate. Открываем командную строку, переходим в папку, которую мы указывали вначале во второй строке (папка dist) и вводим команду: mingw32-make (если вы используете MinGW, а для VS другая команда, которую я не знаю). Библиотека будет создана в папке lib, она называется libglad.a. А ещё в там же, где и папка lib будет создана папка include. Папку include и библиотеку libglad.a нужно скопировать в какую-то выделенную папку и в настройках всех будущих проектов указывать пути к include и lib. Не нужно будет в каждый проект копировать и подключать glad.c