访问GLEW相关的任何内容会立即崩溃MinGW中的程序

时间:2014-11-13 07:35:52

标签: opengl mingw glew clion

以下是代码:

#define GLEW_STATIC
#include "GL/glew.h"

int main () {
    glewExperimental = GL_TRUE;
    return 0;
}

这是输出:

Process finished with exit code -1073741515 (0xC0000135)

当'glewExperimental'行被注释掉时,程序退出0。

这是CMake文件(我正在使用CLion):

cmake_minimum_required(VERSION 2.8.4)
project(untitled)

add_definitions(-DGL_GLEXT_PROTOTYPES)
add_definitions(-DWINVER=0x0602)
add_definitions(-D_WIN32_WINNT=0x0602)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES main.cpp)
add_executable(untitled ${SOURCE_FILES})

target_link_libraries(untitled  glfw3  glew32 opengl32 gdi32)

我在Windows 8.1上使用MinGW工具链。

我使用以下bat文件编译了GLEW库:

gcc -DGLEW_NO_GLU -O2 -Wall -W -Iinclude -DGLEW_BUILD -o src/glew.o -c src/glew.c

gcc -shared -Wl,-soname,libglew32.dll -Wl,--out-implib,lib/libglew32.dll.a -o lib/glew32.dll src/glew.o -L/mingw/lib -lglu32 -lopengl32 -lgdi32 -luser32 -lkernel32

ar cr lib/libglew32.a src/glew.o

我将生成的libglew32.a,libglew32.dll.a放在MinGW / lib文件夹中。

我将teh glew32.dll放在Windows / System32文件夹中。

我将GL / glew.h,glxew.h,wglew.h放在MinGW / include文件夹中。

我错过了什么?

我无法弄清楚为什么简单地为该变量赋值会引发异常......

2 个答案:

答案 0 :(得分:4)

据我所知,有两个问题需要回答:

  

为什么我的程序在包含glewExperimental = GL_TRUE时崩溃;离开的时候不是吗?

您的程序崩溃,因为它无法加载glew库。当你离开这条线路时,没有拨打glew,程序很可能甚至都不会加载它。

  

为什么我的程序找不到glew32.dll,虽然我把它复制到system32文件夹中?

如果您有64位操作系统,则system32是放置 64位 dll的文件夹。我知道这听起来很棒!,但这就是Windows的工作原理。 32位库位于SysWOW64中。此SO答案包含有关此问题的更多详细信息:why-do-64-bit-dlls-go-to-system32-and-32-bit-dlls-to-syswow64-on-64-bit-windows

通常,您不应该将dll放在windows文件夹中的某个位置。这个文件夹是为系统库/系统范围的库(如驱动程序等)保留的。原因是,如果其他人复制了另一个版本的文件,那么你会遇到很大的麻烦。 glew32.dll进入系统文件夹,这很可能会崩溃你的应用程序。放置自己的库的最佳方法是在可执行文件所在的目录中。

答案 1 :(得分:0)

我可以通过将以下行添加到CMakeLists.txt

来解决
add_definitions(-DGLEW_STATIC)

我不明白为什么上述情况会起作用,因为据我所知,以下内容会产生同样的影响:

#define GLEW_STATIC