OpenGL не видит функции библиотек glew и glfw

197
19 февраля 2019, 06:00

Начал изучать OpenGL по курсу "Gameinstitute - OpenGL Graphics Programming". В третьем видио на восемнадцатой минуте происходит сборка сцены, а у меня повыпрыгивали ошибки ;_;

В сборка при вызове функций с префиксом glfw выкидывает ошибку LNK2019 (не видит glfw3) но у меня все подключения присутствуют (на glew не жалуется что уже хорошо) и без вызова функции проект собирается.

Библиотеки скачал с сайта http://www.glfw.org/ https://www.opengl.org/sdk/libs/GLEW/

// lession1.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
//
#include "pch.h"
#include <iostream>
// #define GLEW_STATIC
// #include "common/includes/GL/glew.h" //глев подключ раньше ост
// #include "common/includes/GLFW/glfw3.h"
#include <GL/glew.h> //глев подключ раньше ост
#define GLFW_DLL
#include <GLFW/glfw3.h>
const char * APP_TITLE = "Introduction to Modern OpenGL - Hello Windows 1";
const int gWindowWidth = 800;
const int gWindowHeight = 600;
int main()
{
    if (!glfwInit()) // если глф инит не инициализированно то сюда не зайдет (проверка на подключение библиотек)
    {
        std::cerr << "GLFW initialization failed" << std::endl;
        return -1;  
    }
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    GLFWwindow * pWindow = glfwCreateWindow(gWindowWidth, gWindowHeight, APP_TITLE, NULL, NULL);
    if (pWindow == NULL)
    {
        std::cerr << "Falled to create GLFW window " << std::endl;
        glfwTerminate();  
        return -1;  
    }
    glfwMakeContextCurrent(pWindow); // тоже почитай
    glewExperimental = GL_TRUE;
    if (glewInit() != GLEW_OK) // если инициализалция не ок, то предупрежд и поджопник
    {
        std::cerr << "GLEW initialization falied" << std::endl;
        return -1;  
    }
    // main loop
    while (!glfwWindowShouldClose(pWindow))
    {
        glfwPollEvents();
        glfwSwapBuffers(pWindow);
    }
    glfwTerminate();  
    return 0;
}

Что я делаю не так ??

Потом попробовал в QtСreatore сотворить
.ПРО

QT       += core gui opengl
TARGET = untitled9
TEMPLATE = app
#CONFIG += c++11 console
#CONFIG -= app_bundle
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += main.cpp
DISTFILES += \
    glew32.lib \
    glew32s.lib \
    glfw3.lib \
    glfw3dll.lib \
    glfw3.dll
HEADERS += \
    eglew.h \
    glew.h \
    glfw3.h \
    glfw3native.h \
    glxew.h
LIBS += -lOpengl32 \

Первый вариант main.cpp

#include <QCoreApplication>
#include <glew.h>
#include <glfw3.h>
#include "stdio.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    //---
    // start GL context and O/S window using the GLFW helper library
    if (!glfwInit()) {
        fprintf(stderr, "ERROR: could not start GLFW3\n");
        return 1;
    }
    // uncomment these lines if on Apple OS X
    /*glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
      glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
      glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
      glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);*/
    GLFWwindow* window = glfwCreateWindow(640, 480, "Hello Triangle", NULL, NULL);
    if (!window) {
        fprintf(stderr, "ERROR: could not open window with GLFW3\n");
        glfwTerminate();
        return 1;
    }
    glfwMakeContextCurrent(window);
    // start GLEW extension handler
    glewExperimental = GL_TRUE;
    glewInit();
    // get version info
    const GLubyte* renderer = glGetString(GL_RENDERER); // get renderer string
    const GLubyte* version = glGetString(GL_VERSION); // version as a string
    printf("Renderer: %s\n", renderer);
    printf("OpenGL version supported %s\n", version);
    // tell GL to only draw onto a pixel if the shape is closer to the viewer
    glEnable(GL_DEPTH_TEST); // enable depth-testing
    glDepthFunc(GL_LESS); // depth-testing interprets a smaller value as "closer"
    /* OTHER STUFF GOES HERE NEXT */
    // close GL context and any other GLFW resources
    glfwTerminate();
    //---
    return a.exec();
}

Второй вариант main.cpp (это первый пример из OpenGL SuperBible (6th Edition))

#include <QCoreApplication>
#include <glew.h>
#include <glfw3.h>
#include "stdio.h"
GLuint compile_shaders(void);
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
     GLuint compile_shaders(void);
    return a.exec();
}

GLuint compile_shaders(void)
{
    GLuint vertex_shader;
    GLuint fragment_shader;
    GLuint program;
    // Source code for vertex shader
    static const GLchar * vertex_shader_source[] =
    {
        "#version 430 core \n"
        " \n"
        "void main(void) \n"
        "{ \n"
        " gl_Position = vec4(0.0, 0.0, 0.5, 1.0); \n"
        "} \n"
    };
    // Source code for fragment shader
    static const GLchar * fragment_shader_source[] =
    {
        "#version 430 core \n"
        " \n"
        "out vec4 color; \n"
        " \n"
        "void main(void) \n"
        "{ \n"
        " color = vec4(0.0, 0.8, 1.0, 1.0); \n"
        "} \n"
    };
    // Create and compile vertex shader
    vertex_shader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertex_shader, 1, vertex_shader_source, NULL);
    glCompileShader(vertex_shader);
    // Create and compile fragment shader
    fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragment_shader, 1, fragment_shader_source, NULL);
    glCompileShader(fragment_shader);
    // Create program, attach shaders to it, and link it
    program = glCreateProgram();
    glAttachShader(program, vertex_shader);
    glAttachShader(program, fragment_shader);
    glLinkProgram(program);
    // Delete the shaders as the program has them now
    glDeleteShader(vertex_shader);
    glDeleteShader(fragment_shader);
    return program;
}

В случае с Qt не видит функции библиотек как glew так и glfw.

прим: undefined reference to `_imp____glewCreateShader'

Answer 1

В общем удалось решить через QtCreator

Скачанные архивы glew-2.1.0-win32.zip и glfw кладём в папку проекта. Я их для удобства переименовал glew_bin и glfw_bin.

Добавил от туда библиотеки и заголовочные файлы . Добавлял библиотеки через интерфейс пользователя.

Снимем фсе :3 галочки

Подключаем библиотеку лежащую (МИНГВЕЕЕ)(у меня сборщик из коробки Qt5.10.1) в C:\Qt\Qt5.10.1\Tools\mingw530_32\i686-w64-mingw32\lib\libgdi32.a

ОБЯЗАТЕЛЬНО НАДО ПОДКЛЮЧИТЬ !!!! libgdi32.a

В общем основные сложности прошли (добавлял заголовочные файлы через "Добавить существующие файлы...") и для удобства прописываем INCLUDEPATH(чтоб при подключении полный путь не прописывать).

Еще в самом коде надо подключать заголовочном файлы в таком порядке :

#include <stdio.h>
#include <iostream>
#include <cstdio> // обязательно подключаем для инициализации GLchar и других опенГЛовских переменных
#include <glew.h> //глев подключ раньше ост опенГЛовских библиотек
#include <GL/gl.h>
#include <glfw3.h>

С начало cstdio --> glew --> gl ---> glfw3 .

Только так один за другим (как чёрт за мужиком :3) иначе будет ругаться.

Вот КОД :

experiment.pro

CONFIG += c++11 console
CONFIG -= app_bundle
CONFIG -= qt
DEFINES += QT_DEPRECATED_WARNINGS
QT += opengl
LIBS += -lopengl32
SOURCES += main.cpp
#-
INCLUDEPATH += $$PWD/glfw_bin/include/GLFW/ # добавляем для удобства чтоб напрямую писать
INCLUDEPATH += $$PWD/glew_bin/include/GL/   # только название заголовчного файла без полного пути
HEADERS += \
    glfw_bin/include/GLFW/glfw3.h \
    glfw_bin/include/GLFW/glfw3native.h \
    glew_bin/include/GL/glew.h
#-
win32: LIBS += -L$$PWD/glfw_bin/lib-mingw/ -lglfw3
INCLUDEPATH += $$PWD/glfw_bin/lib-mingw
DEPENDPATH += $$PWD/glfw_bin/lib-mingw
win32: LIBS += -L$$PWD/glfw_bin/lib-mingw/ -lglfw3dll
INCLUDEPATH += $$PWD/glfw_bin/lib-mingw
DEPENDPATH += $$PWD/glfw_bin/lib-mingw
#-- тут попытка
win32: LIBS += -L$$PWD/glew_bin/lib/Release/Win32/ -lglew32
INCLUDEPATH += $$PWD/glew_bin/lib/Release/Win32
DEPENDPATH += $$PWD/glew_bin/lib/Release/Win32
#-  дошло до смешного надо из компилятора библиотеки подтягивать а то он не справляется :3
win32: LIBS += -LC:/Qt/Qt5.10.1/Tools/mingw530_32/i686-w64-mingw32/lib/ -lgdi32
INCLUDEPATH += C:/Qt/Qt5.10.1/Tools/mingw530_32/i686-w64-mingw32/include
DEPENDPATH += C:/Qt/Qt5.10.1/Tools/mingw530_32/i686-w64-mingw32/include
#--#

main.cpp

#include <stdio.h>
#include <iostream>
#include <cstdio> // обязательно подключаем для инициализации GLchar и других опенГЛовских переменных
#include <glew.h> //глев подключ раньше ост опенГЛовских библиотек
#include <GL/gl.h>
#include <glfw3.h>
#define GLEW_STATIC

const char * APP_TITLE = "Introduction to Modern OpenGL - Hello Windows 1";
const int gWindowWidth = 800;
const int gWindowHeight = 600;
int main()
{
    if (!glfwInit()) // если глф инит не инициализированно то сюда не зайдет (проверка на подключение библиотек)
    {
        std::cerr << "GLFW initialization failed" << std::endl;
        return -1; // я как понял  прерывает прогу из за того что ретюрн -1 это по сути команда прекращения работы проги
    }
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    GLFWwindow * pWindow = glfwCreateWindow(gWindowWidth, gWindowHeight, APP_TITLE, NULL, NULL);
    if (pWindow == NULL)
    {
        std::cerr << "Falled to create GLFW window " << std::endl;
        glfwTerminate(); // ? не совсем понятно что она делает
        return -1; // команда прекращения работты проги
    }
    glfwMakeContextCurrent(pWindow); // тоже почитай
    // glewExperimental = GL_TRUE; .// заблочил в связи того что он давал ошибку: "не инициализированная переменная " хотя
    // glewExperimental относиться к GLEWAPI (переменная апишника) странно :/
    if (glewInit() != GLEW_OK) // если инициализалция не ок, то предупреждение и поджопник
    {
        std::cerr << "GLEW initialization falied" << std::endl;
        return -1; // команда прекращения работы проги
    }
    // main loop
    while (!glfwWindowShouldClose(pWindow))
    {
        glfwPollEvents();
        glfwSwapBuffers(pWindow);
    }
    glfwTerminate();  
    return 0;
}

Ух фсе :3

READ ALSO
В чем подвох(ifstream)?

В чем подвох(ifstream)?

Почему-то поток ввода не дает знаки пробелов/перехода на новую строкуФрагмент кода:

207
std::map, std:unordered_map и ключ-структура

std::map, std:unordered_map и ключ-структура

Есть вот такая простенькая структура:

202
С++ std::map заполнение из файла

С++ std::map заполнение из файла

Есть вот такой вот map

173
Найти повторяющиеся символы в строке

Найти повторяющиеся символы в строке

Само задание звучит так:

144