---恢復內容開始---
前言:
本文寫作目的:
是由於本人參考 csdn原文 的方法配置環境時踩了很多坑,所以在此寫一篇文防止以后用到。
工具:
Xcode
CMake
步驟:
准備工作:
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) 重啟
(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 版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
不出意外的話,運行成功會出現一個啥也沒有的綠色窗口,表明我們大功告成了!