glfw和glad是OpenGL开发中常用的库,相比其他的替代品支持更新的特性;cmake是C++广泛使用的项目配置工具。本文用于介绍cmake如何导入这两个库。
glfw
安装
- linux: 直接使用包管理器安装。
- windows: 可以使用vcpkg或者其他C++包管理器安装,以便于cmake引入。
导入cmake
find_package(glfw3 3.4 REQUIRED)
find_package(OpenGL REQUIRED)
add_executable(ProjectName ...)
target_link_libraries(ProjectName OpenGL::GL glfw)
- 注意: 链接库的变量叫做
glfw
,没有定义${glfw3_LIBS}
变量 - 具体版本号3.4可以省略
- 还需要链接OpenGL以使用相关的绘制函数,对于windows,无需find_package,直接链接opengl32.lib。
- 官网文档链接: https://www.glfw.org/docs/latest/build_guide.html#build_link_cmake_package
glad
glad包含glad1和glad2两个版本,对于初学者,两个都可以使用。
安装
- glad1网站: https://glad.dav1d.de/
- glad2网站: https://gen.glad.sh/
- 软件包:2024年11月,
extra
仓库新增了glad
包,这是一个本地的glad2下载器:基于命令行,从glad2的github仓库下载所需文件,需要一定的代理。
glad1
- 主要文件命名为glad.h和glad.c
- Learn OpenGL教程使用这个版本
- 使用
gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)
来加载函数
glad2
“adds more functionality but changes the API”
- 主要文件命名为gl.h和gl.c
- 是glfw主页文档Getting Started所用的版本
- 移除了
gladLoadGLLoader
和GLADloadproc
,直接使用gladLoadGL(glfwGetProcAddress)
加载函数
导入cmake
- glad没有配套的cmake config,需要手动添加到项目。和自己的源文件一起编译。
- 源文件中,glad的头文件include需要放在glfw之前。或者#define GLFW_INCLUDE_NONE以任意顺序include
find_package(glfw3 REQUIRED)
find_package(OpenGL REQUIRED)
# 添加 GLAD 源文件
# 记得把路径改成自己的
#set(GLAD_SOURCES ${PROJECT_SOURCE_DIR}/deps/glad/src/gl.c) # for glad2
set(GLAD_SOURCES ${PROJECT_SOURCE_DIR}/deps/glad/src/glad.c) # for glad1
# 添加 GLAD 头文件路径
include_directories(${PROJECT_SOURCE_DIR}/deps/glad/include)
add_executable(ProjectName
main.cpp # 你的源文件
${GLAD_SOURCES}
)
target_link_libraries(ProjectName
OpenGL::GL
glfw
)
helloworld
测试代码,基于glad2,简化自https://github.com/Dav1dde/glad/blob/glad2/example/c++/hellowindow2.cpp
#include <glad/gl.h>
#include <GLFW/glfw3.h>
#include <iostream>
int main() {
glfwInit();
const GLuint WIDTH = 800, HEIGHT = 600;
GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", NULL, NULL);
glfwMakeContextCurrent(window);
if (window == NULL) {
std::cerr << "Failed to create GLFW window\n";
glfwTerminate();
return -1;
}
int version = gladLoadGL(glfwGetProcAddress);
if (version == 0) {
std::cerr << "Failed to initialize OpenGL context\n";
return -1;
}
std::cout << "Loaded OpenGL " << GLAD_VERSION_MAJOR(version) << "." << GLAD_VERSION_MINOR(version) << "\n";
glViewport(0, 0, WIDTH, HEIGHT);
while (!glfwWindowShouldClose(window)) {
glfwSwapBuffers(window);
glfwPollEvents();
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
}
glfwTerminate();
return 0;
}