Mac Intel平台CLion+CMake环境下GLEW初始化后C++项目崩溃求助
解决Mac Intel芯片下CLion+CMake使用GLEW时glewInit()崩溃的问题
问题现象
在搭载Intel芯片的Mac系统上,使用CLion和CMake开发基于GLEW的窗口应用时,调用glewInit()后项目崩溃,报错:
Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
用户提供的代码如下:
main.cpp
#include "GL/glew.h" #include <GLFW/glfw3.h> int main() { GLFWwindow* window; if (!glfwInit()) return -1; glewInit(); window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL); if (!window) { glfwTerminate(); return -1; } glfwMakeContextCurrent(window); while (!glfwWindowShouldClose(window)) { glClear(GL_COLOR_BUFFER_BIT); glfwSwapBuffers(window); glfwPollEvents(); } glfwTerminate(); return 0; }
CMake配置
cmake_minimum_required(VERSION 3.22) project(renderer) set(CMAKE_CXX_STANDARD 14) include_directories(/usr/local/Cellar/glfw/3.3.8/include) include_directories(/usr/local/Cellar/glew/2.2.0_1/include) add_definitions(-DGLEW_STATIC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -framework CoreFoundation -framework OpenGL -framework GLUT ") add_executable(renderer main.cpp) target_link_libraries(renderer /usr/local/Cellar/glfw/3.3.8/lib/libglfw.3.3.dylib) target_link_libraries(renderer /usr/local/Cellar/glew/2.2.0_1/lib/libGLEW.2.2.dylib)
解决步骤
1. 修正GLEW初始化顺序
GLEW必须在创建GLFW窗口并设置当前OpenGL上下文之后才能初始化,否则会因没有有效上下文而崩溃。修改main.cpp中的初始化顺序:
#include "GL/glew.h" #include <GLFW/glfw3.h> int main() { GLFWwindow* window; if (!glfwInit()) return -1; // 先创建窗口并设置上下文 window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL); if (!window) { glfwTerminate(); return -1; } glfwMakeContextCurrent(window); // 现在再初始化GLEW GLenum err = glewInit(); if (err != GLEW_OK) { fprintf(stderr, "GLEW初始化失败: %s\n", glewGetErrorString(err)); glfwTerminate(); return -1; } while (!glfwWindowShouldClose(window)) { glClear(GL_COLOR_BUFFER_BIT); glfwSwapBuffers(window); glfwPollEvents(); } glfwTerminate(); return 0; }
2. 匹配GLEW_STATIC定义与链接库类型
你已经添加了add_definitions(-DGLEW_STATIC),但当前链接的是GLEW的动态库(.dylib),这会导致符号冲突。需要改为链接静态库:
在CMake配置中,找到GLEW的静态库文件(通常是libGLEW.a),替换动态库的链接路径:
cmake_minimum_required(VERSION 3.22) project(renderer) set(CMAKE_CXX_STANDARD 14) include_directories(/usr/local/Cellar/glfw/3.3.8/include) include_directories(/usr/local/Cellar/glew/2.2.0_1/include) add_definitions(-DGLEW_STATIC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -framework CoreFoundation -framework OpenGL -framework GLUT ") add_executable(renderer main.cpp) target_link_libraries(renderer /usr/local/Cellar/glfw/3.3.8/lib/libglfw.3.3.dylib) # 替换为GLEW静态库路径 target_link_libraries(renderer /usr/local/Cellar/glew/2.2.0_1/lib/libGLEW.a)
如果找不到静态库,可以通过Homebrew重新安装带静态库的GLEW:
brew reinstall glew --static
原因说明
- 初始化顺序错误:GLEW需要依赖一个活跃的OpenGL上下文来加载OpenGL扩展函数,在创建窗口并设置上下文前调用
glewInit()会导致无效内存访问,触发SIGSEGV。 - 库类型不匹配:定义
GLEW_STATIC后,编译器会按照静态库的方式处理GLEW的符号,此时链接动态库会导致符号重复定义或缺失,引发崩溃。
内容的提问来源于stack exchange,提问作者Fabboy
相关产品推荐
相关产品推荐

