OpenGL - glload 对"wglGetProcAddress@4"的未定义引用



我下载了非官方的OpenGL SDK,并使用Premake4创建了Makefile,并用Mingw 4.8.4。

我也在使用qtcreator

这是我的.pro文件

TEMPLATE = app
QT += opengl
SOURCES += main.cpp
QMAKE_CXXFLAGS += -std=gnu++11
INCLUDEPATH += C:/glsdk/freeglut/include
LIBS += -LC:/glsdk/freeglut/lib -lfreeglut
INCLUDEPATH += C:/glsdk/glload/include
LIBS += -LC:/glsdk/glload/lib -lglloadD

我也在烦恼ArcSynsis OpenGL教程,并试图构建" Hello Triangle示例":

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <stdio.h>
#include <glload/gl_3_3.h>
#include <glload/gll.hpp>
#include <GL/freeglut.h>
using namespace std;

GLuint CreateShader(GLenum eShaderType, const std::string &strShaderFile)
{
    GLuint shader = glCreateShader(eShaderType);
    const char *strFileData = strShaderFile.c_str();
    glShaderSource(shader, 1, &strFileData, NULL);
    glCompileShader(shader);
    GLint status;
    glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
    if (status == GL_FALSE)
    {
        GLint infoLogLength;
        glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength);
        GLchar *strInfoLog = new GLchar[infoLogLength + 1];
        glGetShaderInfoLog(shader, infoLogLength, NULL, strInfoLog);
        const char *strShaderType = NULL;
        switch(eShaderType)
        {
        case GL_VERTEX_SHADER: strShaderType = "vertex"; break;
        case GL_GEOMETRY_SHADER: strShaderType = "geometry"; break;
        case GL_FRAGMENT_SHADER: strShaderType = "fragment"; break;
        }
        fprintf(stderr, "Compile failure in %s shader:n%sn", strShaderType, strInfoLog);
        delete[] strInfoLog;
    }
    return shader;
}
GLuint CreateProgram(const std::vector<GLuint> &shaderList)
{
    GLuint program = glCreateProgram();
    for(size_t iLoop = 0; iLoop < shaderList.size(); iLoop++)
        glAttachShader(program, shaderList[iLoop]);
    glLinkProgram(program);
    GLint status;
    glGetProgramiv (program, GL_LINK_STATUS, &status);
    if (status == GL_FALSE)
    {
        GLint infoLogLength;
        glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLogLength);
        GLchar *strInfoLog = new GLchar[infoLogLength + 1];
        glGetProgramInfoLog(program, infoLogLength, NULL, strInfoLog);
        fprintf(stderr, "Linker failure: %sn", strInfoLog);
        delete[] strInfoLog;
    }
    for(size_t iLoop = 0; iLoop < shaderList.size(); iLoop++)
        glDetachShader(program, shaderList[iLoop]);
    return program;
}
GLuint theProgram;
const std::string strVertexShader(
    "#version 330n"
    "layout(location = 0) in vec4 position;n"
    "void main()n"
    "{n"
    "   gl_Position = position;n"
    "}n"
);
const std::string strFragmentShader(
    "#version 330n"
    "out vec4 outputColor;n"
    "void main()n"
    "{n"
    "   outputColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);n"
    "}n"
);
void InitializeProgram()
{
    std::vector<GLuint> shaderList;
    shaderList.push_back(CreateShader(GL_VERTEX_SHADER, strVertexShader));
    shaderList.push_back(CreateShader(GL_FRAGMENT_SHADER, strFragmentShader));
    theProgram = CreateProgram(shaderList);
    std::for_each(shaderList.begin(), shaderList.end(), glDeleteShader);
}
const float vertexPositions[] = {
    0.75f, 0.75f, 0.0f, 1.0f,
    0.75f, -0.75f, 0.0f, 1.0f,
    -0.75f, -0.75f, 0.0f, 1.0f,
};
GLuint positionBufferObject;
GLuint vao;

void InitializeVertexBuffer()
{
    glGenBuffers(1, &positionBufferObject);
    glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}
//Called after the window and OpenGL are initialized. Called exactly once, before the main loop.
void init()
{
    InitializeProgram();
    InitializeVertexBuffer();
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
}

void display()
{
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    glUseProgram(theProgram);
    glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glDisableVertexAttribArray(0);
    glUseProgram(0);
    glutSwapBuffers();
}
void reshape(GLsizei w,GLsizei h){
    GLint zero = 0;
    cout << "D ";
    glViewport(zero,zero,w,h);
}
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    int width = 500;
    int height = 500;
    unsigned int displayMode = GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH | GLUT_STENCIL;

    glutInitDisplayMode (displayMode);
    glutInitContextVersion (3, 3);
    glutInitContextProfile(GLUT_CORE_PROFILE);
#ifdef DEBUG
    glutInitContextFlags(GLUT_DEBUG);
#endif
    glutInitWindowSize (width, height);
    glutInitWindowPosition (300, 200);
    int window = glutCreateWindow (argv[0]);
    glload::LoadFunctions();
    glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION);
    if(!glload::IsVersionGEQ(3, 3))
    {
        printf("Your OpenGL version is %i, %i. You must have at least OpenGL 3.3 to run this tutorial.n",
            glload::GetMajorVersion(), glload::GetMinorVersion());
        glutDestroyWindow(window);
        return 0;
    }
    if(glext_ARB_debug_output)
    {
        glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB);
        //glDebugMessageCallbackARB(DebugFunc, (void*)15);
    }
    init();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    //glutKeyboardFunc(keyboard);
    glutMainLoop();
    return 0;
}

,但我总是会遇到以下错误。

c: glsdk glload source wgll_ext.c:140:错误:未定义的引用 `wglgetProcaddress@4'

我什至不知道为什么它在Glload source文件夹中看起来。

有什么想法?

windows 特定 opengl 函数,您是否正在开发 Windows 应用程序?

看来,您关注的那些教程被定义为使用 Windows OpenGl 的实现,它们将无法与该非正式的OpenGL SDK 由于缺少wglGetProcAddress

最新更新