---恢复内容开始---
前言:
本文写作目的:
是由于本人参考 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#include
int main()
{
return 0;
}
此时有一定的可能Xcode会提示找不到这两个头文件,我就是踩了这个坑,明明配置里已经写清楚了怎么有这种神经错误.....
我的解决方案是,将 /usr/ 下的include和lib文件夹直接拷贝到一个你认为合适的地方,再在Xcode配置里改为你的路径。
现在,我猜你的Xcode已经能成功编译了,将你的 main.cpp 的内容改为我引用的csdn博主的代码来测试:
// System Headers #include#include // Standard Headers #include #include #include 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 版权声明:本文为博主原创文章,转载请附上博文链接!
不出意外的话,运行成功会出现一个啥也没有的绿色窗口,表明我们大功告成了!