macOS Mojave配置OpenGL開發環境

---恢復內容開始---html

 

前言:

  本文寫做目的:ios

  是因爲本人蔘考 csdn原文 的方法配置環境時踩了不少坑,因此在此寫一篇文防止之後用到。git

工具:

  Xcodegithub

  CMakexcode

步驟:

  準備工做:

  Xcode通常Mac用戶都安裝了。函數

 

  1. 在終端鍵入  xcode-select --install  安裝Xcode command Line Tools, 裏面包含了不少Apple打包的經常使用工具,必定要安裝。工具

 

  2. 本人踩的第一個坑是macOS Mojave把 /usr/local/ 路徑下的 include lib 文件夾移除了,後面配置會找不到,因此咱們先在終端鍵入  cd /Library/Developer/CommandLineTools/Packages/  而後鍵入  open macOS_SDK_headers_for_macOS_10.14.pkg  來將頭文件和庫文件安裝到  /usr/include ; /usr/lib 。測試

 

  3. 後面的步驟會涉及往 include 文件夾和 lib 文件夾裏添加文件的操做,這兩個文件夾是連繫統管理員都禁止修改的 ,因此咱們必須按如下步驟賦予咱們操做的權限:網站

  (1) 重啓ui

  (2) 啓動當即按住 command + r , 進入恢復模式 ,在恢復模式裏打開終端 , 鍵入  csrutil disable  

  (3) 重啓

 

  4. 以後安裝CMake下載CMake  ,下載macOS版本的dmg安裝文件 , 安裝CMake

 

  5. 進入 下載GLFW ,下載GLFW的Source Package (源代碼)

 

  6. 根據 learnopgl網 「建立窗口」下方的CMake部分,將你下載的GLFW文件夾進行編譯(記得在這個文件夾裏再新建一個叫build的文件夾,用做CMake的編譯目標文件夾)。編譯完成後瀏覽一下 build/src ,裏面有一個 libglfw3.a 文件,將它複製進 /usr/lib 文件夾中

 

  7. 終端cd進你的build目錄,依次鍵入  make  與  make install , 完成後關閉終端

 

  8. 進入glad 在線服務 網站, 將語言(Language)設置爲C/C++,在API選項中,選擇3.3以上的OpenGL(gl)版本(咱們的教程中將使用3.3版本,但更新的版本也能正常工做)。以後將模式(Profile)設置爲Core,而且保證生成加載器(Generate a loader)的選項是選中的。如今能夠先忽略拓展(Extensions)中的內容。都選擇完以後,點擊生成(Generate)按鈕來生成庫文件。而後在文件列表裏點擊glad.zip文件進行下載。

 

  9. 下載後的壓縮包有兩個頭文件文件夾(glad和KHR)和一個 glad.c 文件,解壓出來 , 將此兩個頭文件文件夾與以前編譯的glfw根目錄裏的include文件夾裏的GLFW文件夾一併複製進 /usr/include 文件夾中 (重點)

 

  10. 打開Xcode,新建一個macOS下的command Line tool工程,語言選擇C++,進入工程配置(假設咱們的工程就叫OpenGL):

    (1) 在左側文件欄右鍵(工程名)文件夾 

    

    選擇 Add files to "(工程名)" , 將以前解壓的 glad.c 文件添加進來,此文件實現了 glad.h 中的大量功能

    (2) 左鍵點擊(工程名)文件夾上方的(工程名),進入配置界面

    

 

    首先如圖在搜索框輸入search,找到兩個配置頭文件和庫文件的選項,雙擊它們來添加咱們的路徑:

    

 

而後咱們移動到 Build Phases 選項卡,在 Link Binary With Libraries 中將五個 .framework 以及咱們拷貝進lib的 libglfw3.a 文件添加進咱們的工程 : (注意,五個framework文件能夠直接在彈出的搜索框裏搜索到,可是 libglfw3.a 須要咱們手動點擊 Add other 並在 /usr/bin 中找到)

 

如今,咱們離成功不遠了,在文件列表裏新建一個 main.cpp , 添加以下內容測試( glad.h必須在glfw3.h上面 ):

#include <glad/glad.h>
#include <GLFW/glfw3.h>

int main()
{
  return 0;
}

此時有必定的可能Xcode會提示找不到這兩個頭文件,我就是踩了這個坑,明明配置裏已經寫清楚了怎麼有這種神經錯誤.....

 

個人解決方案是,將 /usr/ 下的include和lib文件夾直接拷貝到一個你認爲合適的地方,再在Xcode配置裏改成你的路徑。

 

如今,我猜你的Xcode已經能成功編譯了,將你的 main.cpp 的內容改成我引用的csdn博主的代碼來測試:

// System Headers
#include <glad/glad.h>
#include <GLFW/glfw3.h>

// Standard Headers
#include <cstdio>
#include <cstdlib>
#include <iostream>

void framebuffer_size_callback(GLFWwindow* window, int width, int height);//回調函數原型聲明
void processInput(GLFWwindow *window);

// settings
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;

int main(int argc, char * argv[]) {

    //初始化GLFW
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#ifdef __APPLE__
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // uncomment this statement to fix compilation on OS X
#endif
    //建立一個窗口對象
    GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "FirstGL", NULL, NULL);
    if (window == NULL)
    {
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }
    //通知GLFW將咱們窗口的上下文設置爲當前線程的主上下文
    glfwMakeContextCurrent(window);
    //對窗口註冊一個回調函數,每當窗口改變大小,GLFW會調用這個函數並填充相應的參數供你處理
    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);

        // 檢查並調用事件,交換緩衝
        glfwSwapBuffers(window);//檢查觸發事件
        glfwPollEvents();    //交換顏色緩衝
    }

    //釋放/刪除以前的分配的全部資源
    glfwTerminate();
    return EXIT_SUCCESS;
}

//輸入控制,檢查用戶是否按下了返回鍵(Esc)
void processInput(GLFWwindow *window)
{
    if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, true);
}

// 當用戶改變窗口的大小的時候,視口也應該被調整 
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    // 注意:對於視網膜(Retina)顯示屏,width和height都會明顯比原輸入值更高一點。
    glViewport(0, 0, width, height);
}
--------------------- 
做者:milletluo 
來源:CSDN 
原文:https://blog.csdn.net/lm409/article/details/78420044 
版權聲明:本文爲博主原創文章,轉載請附上博文連接!

不出意外的話,運行成功會出現一個啥也沒有的綠色窗口,代表咱們大功告成了!

相關文章
相關標籤/搜索