You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:27:28