3

这是代码:

#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 文件夹中。

我错过了什么?

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

4

2 回答 2

4

据我了解,有两个问题需要回答:

当我包含 glewExperimental = GL_TRUE; 时,为什么我的程序会崩溃 但不是在离开它的时候?

您的程序崩溃,因为它无法加载 glew 库。当你离开这条线时,不会调用 glew 并且程序很可能甚至不会加载它。

为什么我的程序没有找到 glew32.dll 虽然我将它复制到 system32 文件夹中?

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

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

于 2014-11-13T12:40:29.593 回答
1

我能够通过将以下行添加到 CMakeLists.txt 来解决

add_definitions(-DGLEW_STATIC)

我不明白为什么上述内容会起作用,因为据我了解,以下内容会产生相同的影响:

#define GLEW_STATIC
于 2014-11-14T03:56:30.080 回答