2014-11-13 1 views
2

Вот код:Доступ ничего GLEW связанные непосредственно врезается программы в MinGW

#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) 

Я использую toolchain MinGW в Windows 8.1.

Я собирал библиотеку 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

Вы никогда не должны размещать в DLLs папке System32 самостоятельно. Эта папка предназначена для системных DLL. Просто разместите их в папке, в которой находится ваш исполняемый файл. – BDL

+1

Ваш код уже определяет 'GLEW_STATIC'. Это означает, что все эти обсуждения о DLL-версии GLEW совершенно неактуальны. Вы должны были создать и связать со статической (не DLL) библиотекой GLEW. Вполне возможно, что после того, как вы это выясните, ваша проблема может исчезнуть - вам, разумеется, не придется беспокоиться о том, куда идет GLEW DLL, так как это необязательно. –

ответ

3

Как я понял, есть два вопроса, чтобы ответить:

Почему мой крах программы, когда я включаю glewExperimental = GL_TRUE; но не при его уходе?

Ваша программа вылетает из-за того, что она не может загрузить библиотеку glew. Когда вы покидаете эту линию, вызов не выполняется, и программа, скорее всего, даже не загрузит его.

Почему моя программа не находит glew32.dll, хотя я скопировал ее в папку system32?

Если у вас есть операционная система 64-разрядную, чем system32 папка, где 64-разрядные DLLs помещаются. Я знаю, что это звучит sic !, но вот как работают окна. 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 в системную папку, которая скорее всего приведет к сбою приложения. Лучший способ разместить свои собственные библиотеки - это каталог, в котором находится ваш исполняемый файл.

+0

Спасибо этому просветить мой день! я начинал сумасшедший с glut32, давая мне ошибки –

0

Мне удалось решить, добавив следующую строку в CMakeLists.TXT

add_definitions(-DGLEW_STATIC) 

Я не понимаю, почему выше будет работать так, чтобы мое понимание следующее имело бы тот же эффект:

#define GLEW_STATIC 
Смежные вопросы