首页 > 技术文章 > Mac搭建OpenGL开发环境

ring1992 2020-05-27 16:35 原文

一、构建GLFW

GLFW 是配合 OpenGL 使用的轻量级工具程序库,缩写自 Graphics Library Framework(图形库框架)。GLFW 的主要功能是创建并管理窗口和 OpenGL 上下文,同时还提供了处理手柄、键盘、鼠标输入的功能。

下载地址:https://www.glfw.org/download.html

我们可以选择直接下载编译好的库,也可以下载源文件然后通过camke来自己编译,区别是如果用cmake库的话,在执行成功以后,会直接将生成的库与头文件分别添加到系统路径,也就是/usr/local/include和/usr/local/lib。

这里我选择了下载编译好的库

 

 

二、配置GLAD

GLAD是一个开源项目:https://github.com/Dav1dde/glad
同时它还提供了一个在线服务:https://glad.dav1d.de/
打开GLAD在线服务,如图11所示,我设置语言为C/C++,gl版本选择4.6:

 点击GENERATE按钮,GLAD现在应该提供给你了一个zip压缩文件,包含两个头文件目录,和一个glad.c文件

 

 

 

三、创建XCode项目

3.1 新建XCode项目,如图13所示,选择”Command Line Tool“:

 

3.2 导入第三方库:

将之前下载的编译好的GLFW库和GLAD文件导入项目中

 

 3.3 链接第三方库:

 

 设置libs搜索路径:

 

 设置头文件的搜索路径:

 

 3.4 把glad.c加入到工程项目中:

 3.5 示例代码:

 1 #include <glad.h>
 2 #include <glfw3.h>
 3 
 4 #include <iostream>
 5 
 6 void framebuffer_size_callback(GLFWwindow* window, int width, int height);
 7 void processInput(GLFWwindow *window);
 8 
 9 // settings
10 const unsigned int SCR_WIDTH = 800;
11 const unsigned int SCR_HEIGHT = 600;
12 
13 int main()
14 {
15     // glfw: initialize and configure
16     // ------------------------------
17     glfwInit();
18     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
19     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
20     glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
21 
22 #ifdef __APPLE__
23     glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
24 #endif
25 
26     // glfw window creation
27     // --------------------
28     GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL);
29     if (window == NULL)
30     {
31         std::cout << "Failed to create GLFW window" << std::endl;
32         glfwTerminate();
33         return -1;
34     }
35     glfwMakeContextCurrent(window);
36     glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
37 
38     // glad: load all OpenGL function pointers
39     // ---------------------------------------
40     if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
41     {
42         std::cout << "Failed to initialize GLAD" << std::endl;
43         return -1;
44     }
45 
46     // render loop
47     // -----------
48     while (!glfwWindowShouldClose(window))
49     {
50         // input
51         // -----
52         processInput(window);
53 
54         // render
55         // ------
56         glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
57         glClear(GL_COLOR_BUFFER_BIT);
58 
59         // glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
60         // -------------------------------------------------------------------------------
61         glfwSwapBuffers(window);
62         glfwPollEvents();
63     }
64 
65     // glfw: terminate, clearing all previously allocated GLFW resources.
66     // ------------------------------------------------------------------
67     glfwTerminate();
68     return 0;
69 }
70 
71 // process all input: query GLFW whether relevant keys are pressed/released this frame and react accordingly
72 // ---------------------------------------------------------------------------------------------------------
73 void processInput(GLFWwindow *window)
74 {
75     if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
76         glfwSetWindowShouldClose(window, true);
77 }
78 
79 // glfw: whenever the window size changed (by OS or user resize) this callback function executes
80 // ---------------------------------------------------------------------------------------------
81 void framebuffer_size_callback(GLFWwindow* window, int width, int height)
82 {
83     // make sure the viewport matches the new window dimensions; note that width and
84     // height will be significantly larger than specified on retina displays.
85     glViewport(0, 0, width, height);
86 }

3.6 示例代码的运行结果

四、遇到的问题

按照步骤配置,发现并没有成功运行,出现如下错误:

dyld: Library not loaded: @rpath/libglfw.3.dylib

  Referenced from: /Users/a11/Library/Developer/Xcode/DerivedData/GlfwTest-fswltakqdftvrjhcuqcxnrfzjoko/Build/Products/Debug/GlfwTest

  Reason: image not found

 

 

这个意思是找不到dylib库图片(镜像)了,我们再来确认下这个库是否链接了

 

 

 

 发现这个库文件确实存在,是不是重新导入就好了,结果重新导入没有成功。

解决办法:

将出现问题的Framework拷贝到项目里去,步骤如下图所示:

 

 

 

 

 把出现Reason:image not found的Framework添加进去

 添加之后再次运行,成功运行! 

 项目链接

推荐阅读