集成Conan库后调用glCreateShader抛出0xc0000005异常排查求助
问题根因
你遇到的0xc0000005 DEP违规 at 0x00000000本质是调用了空函数指针:崩溃时glCreateShader的函数指针值为0,CPU跳转到0地址执行代码触发了数据执行保护拦截。这个问题和PhysX、Conan本身没有直接关系,是OpenGL上下文与glad初始化、CMake配置两个层面的错误共同导致的。
排查修复步骤
1. 优先修复glad初始化逻辑(90%概率直接解决崩溃)
所有glad提供的OpenGL函数,必须满足两个前提才能正常调用:
- 已经通过GLFW(或其他窗口库)创建了OpenGL上下文,且通过
glfwMakeContextCurrent把上下文绑定到当前线程 - 已经加载完OpenGL函数指针
你现在的代码里大概率漏了glad加载步骤,或者加载时机不对。在你的main函数里,创建完GLFW窗口、绑定上下文之后,必须加入这行代码:
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { throw std::runtime_error("Failed to initialize GLAD"); }
注意:这行代码必须放在glfwMakeContextCurrent之后,任何gl函数调用(包括glCreateShader、glGenVertexArrays这类)之前*。如果没加这行,glad里所有gl开头的函数指针都是默认值0,一调用就会跳转到0地址触发你看到的崩溃。
可以先加个简单验证:在调用glCreateShader之前打个断点,看一下glCreateShader这个函数指针的值,如果是0x0就坐实是初始化问题。
2. 修复CMake配置的结构性错误
你现在的CMake配置有几个明显的逻辑错误,虽然不是这次崩溃的直接原因,但后续一定会引发链接、运行时库冲突问题:
- 目录与目标完全错位:你自己描述的架构是「engine模块是通用能力静态库,game模块是业务逻辑生成可执行文件」,但现在的配置完全反过来了:
engine目录下的CMake在生成Game可执行文件,game目录下的CMake在生成Engine静态库,直接导致根CMake的add_subdirectory顺序错误——根CMake先执行add_subdirectory(engine)时,Engine库目标还没被定义,链接时会出现隐式规则问题,甚至可能错误链接到系统里同名的旧库。
修复方式:把两个目录下的CMakeLists.txt互换位置:- 生成
Engine静态库的CMake放到engine目录下,去掉里面所有../engine/的冗余相对路径 - 生成
Game可执行文件的CMake放到game目录下 - 根目录CMake调整
add_subdirectory顺序:先加所有第三方库,再加engine,最后加game(因为game依赖engine,必须等engine目标定义完再处理game子目录)
- 生成
- 重复调用Conan配置:不需要在两个子模块里都写
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)和conan_basic_setup(),把这两行移到根目录CMake里,在所有add_subdirectory之前调用一次就行,重复调用会覆盖编译选项,容易导致运行时库(/MT、/MD)不匹配的问题。 - 无意义的编译指令:shader.cpp是源文件,开头不要加
#pragma once,这是头文件用的编译指令,写在cpp里没有任何作用,还可能误导编译器。
3. 额外排查点
如果做完上面两步还是崩溃,检查两个点:
- 确认你用的glad是和GLFW创建的OpenGL版本匹配的(比如你要开OpenGL 4.3核心模式,glad生成的时候也要选对应版本,不要选低版本的glad加载高版本上下文)
- 检查链接的glad库是不是你自己
externalCode/glad下编译的版本,不要和系统里其他glad、opengl32库冲突,链接时把opengl相关的库放在依赖列表最后即可。
内容的提问来源于stack exchange,提问作者Jonas Schindler
相关产品推荐
相关产品推荐

