Доступ ко всему, что связано с 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)

Я использую набор инструментов MinGW в Windows 8.1.

Я скомпилировал библиотеку GLEW со следующим файлом bat:

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.

Я поместил glew32.dll в папку Windows / System32.

Я поместил GL / glew.h, glxew.h, wglew.h в папку MinGW / include.

Что мне не хватает?

Я не могу понять, почему простое присвоение значения этой переменной вызывает исключение ...


person amortaza    schedule 13.11.2014    source источник
comment
Никогда не помещайте библиотеки DLL в папку System32 самостоятельно. Эта папка предназначена для системных dll. Просто поместите их в папку, в которой находится ваш исполняемый файл.   -  person BDL    schedule 13.11.2014
comment
Ваш код уже определяет GLEW_STATIC. Это означает, что все эти обсуждения DLL-версии GLEW совершенно неуместны. Вы должны были собрать и скомпилировать статическую (не DLL) библиотеку GLEW. Вполне возможно, что после того, как вы разберетесь с этим, ваша проблема может исчезнуть - вам, конечно, не придется беспокоиться о том, где находится GLEW DLL, поскольку в этом нет необходимости.   -  person Andon M. Coleman    schedule 14.11.2014


Ответы (2)


Как я понял, нужно ответить на два вопроса:

Почему моя программа вылетает, когда я включаю glewExperimental = GL_TRUE; но не оставляя его подальше?

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

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

Если у вас 64-разрядная операционная система, то system32 - это папка, в которой размещаются 64-разрядные библиотеки DLL. Я знаю, это звучит sic !, но именно так работают окна. 32-битные библиотеки находятся в SysWOW64. Этот SO-ответ содержит более подробную информацию об этом: почему-do-64-bit-dlls-go-to-system32-and-32-bit-dlls-to-syswow64-on-64-bit-windows < / а>.

В общем, вам никогда не следует размещать библиотеки DLL где-нибудь в папке Windows. Эти папки зарезервированы для системных библиотек / общесистемных библиотек, таких как драйверы и т. Д. Причина этого в том, что у вас могут возникнуть серьезные проблемы, если кто-то другой скопирует другую версию, например. glew32.dll в системную папку, что, скорее всего, приведет к сбою вашего приложения. Лучше всего разместить свои собственные библиотеки в каталоге, в котором находится исполняемый файл.

person BDL    schedule 13.11.2014
comment
Спасибо, просвети мой день! я начал сходить с ума от glut32, выдававшего мне ошибки - person seb_kaine; 30.03.2017

Я смог решить, добавив следующую строку в CMakeLists.txt

add_definitions(-DGLEW_STATIC)

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

#define GLEW_STATIC
person amortaza    schedule 14.11.2014