本篇文章将阐述在Mac os Monterey(12.2.1)的CLion(2021.3.3)上配置OpenGL的整体过程。虽然网上已有相关的文章,但有很多操作存在问题,可能是Mac系统变迁的原因,故作此文。
原参考文章:Mac Clion OpenGL开发环境配置
打开 terminal,用homebrew(默认已有)安装依赖项
brew install glew brew install glfw3
可以通过下述命令来查看上述两个依赖项的安装位置
brew list glew brew list glfw
配置Glad,通道在此
①
②
③将glad.zip进行解压后里面就是上图中的include和src,将include/glad文件夹下的glad.h中的
#include <KHR/khrplatform.h>
更改为#include <khrplatform.h>
④将include里面的两个文件夹glad与KHR拖入
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
(这与参考文章里的地址不同,那篇文章中的文件夹是真的没找到在哪),而src文件夹则直接拖入CLion中的项目文件夹(这个项目配置与普通C++项目配置相同)接下来配置CLion项目文件中的CMakeLists.txt文件
cmake_minimum_required(VERSION 3.21) project(OpenGLab) set(CMAKE_CXX_STANDARD 23) ###############上面部分不用改,按自己原来的即可############### #设置一些OpenGL头文件所在目录的宏 set(GLEW_H /opt/homebrew/Cellar/glew/2.2.0_1/include/GL) set(GLFW_H /opt/homebrew/Cellar/glfw/3.3.6/include/GLFW) #设置OpenGL库所在位置,并链接 set(GLEW_LINK /opt/homebrew/Cellar/glew/2.2.0_1/lib/libGLEW.2.2.0.dylib) set(GLFW_LINK /opt/homebrew/Cellar/glfw/3.3.6/lib/libglfw.3.3.dylib) link_libraries(${OPENGL} ${GLEW_LINK} ${GLFW_LINK}) ######################################################### set(GLAD_H /usr/local/include/) set(GLAD_H /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/glad) set(KH_H /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/KHR) #包含上述头文件所在目录 include_directories(${GLEW_H} ${GLFW_H} ${GLAD_H} ${KH_H}) #设置要编译的c/cpp文件到可执行文件中,该exe包含两个文件glad.c,main.cpp,生成OpenGLab set(SOURCE_FILES "src/glad.c" "main.cpp") add_executable(OpenGLab ${SOURCE_FILES}) # mac下这步很重要 if (APPLE) target_link_libraries(OpenGLab "-framework OpenGL") target_link_libraries(OpenGLab "-framework GLUT") endif()
⚠️将代码中我的项目名称OpenGLab换成你自己的项目名,另外#之间代码中的路径可能需要修改,请参考第一步中
brew list
的结果(主要是版本号可能不同的问题,我这里glew是2.2.0_1,glfw是3.3.6)测试代码——from 参考文章
#include <glew.h> #include <glfw3.h> #include <iostream> using namespace std; void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode) { //如果按下ESC,把windowShouldClose设置为True,外面的循环会关闭应用 if(key==GLFW_KEY_ESCAPE && action == GLFW_PRESS) glfwSetWindowShouldClose(window, GL_TRUE); std::cout<<"ESC"<<mode; } int main(void) { //初始化GLFW库 if(!glfwInit()) return -1; //创建窗口以及上下文 GLFWwindow* window = glfwCreateWindow(640, 480, "hello world", NULL, NULL); if(!window) { //创建失败会返回NULL glfwTerminate(); } //建立当前窗口的上下文 glfwMakeContextCurrent(window); glfwSetKeyCallback(window, key_callback); //注册回调函数 //循环,直到用户关闭窗口 while(!glfwWindowShouldClose(window)) { /*******轮询事件*******/ glfwPollEvents(); /*******渲染*******/ //选择清空的颜色RGBA glClearColor(0.2, 0.3, 0.3, 1); glClear(GL_COLOR_BUFFER_BIT); //开始画一个三角形 glBegin(GL_TRIANGLES); glColor3f(1, 0, 0); //Red glVertex3f(0, 1, 1); glColor3f(0, 1, 0); //Green glVertex3f(-1, -1, 0); glColor3f(0, 0, 1); //Blue glVertex3f(1, -1, 0); //结束一个画图步骤 glEnd(); /******交换缓冲区,更新window上的内容******/ glfwSwapBuffers(window); } glfwTerminate(); return 0; }