“警告:在def文件末尾损坏.drectve”是什么意思?

时间:2014-07-22 20:24:50

标签: c++ opengl compiler-warnings mingw32

在这个环境中,我编译了一个在线发布的c ++ / openGL示例:

  1. Windows 7
  2. Code :: Blocks v 13.12
  3. MinGW build 2013年10月(不确定版本)
  4. mingw32-g ++ v 4.8.1
  5. 来自codeincodeblock.com的代码:

    #define GLEW_STATIC
    // third-party libraries
    #include <windows.h>
    #include <GL/glew.h>
    #include <GL/glfw.h>
    #include <glm/glm.hpp>
    
    #include <cassert>
    #include <iostream>
    #include <stdexcept>
    
    
    GLuint gVAO = 0;
    GLuint gVBO = 0;
    GLuint programId;
    const glm::vec2 SCREEN_SIZE(800, 600);
    
    static void LoadTriangle() {
        // make and bind the VAO
        glGenVertexArrays(1, &gVAO);
        glBindVertexArray(gVAO);
    
        // make and bind the VBO
        glGenBuffers(1, &gVBO);
        glBindBuffer(GL_ARRAY_BUFFER, gVBO);
    
        // Put the three triangle verticies into the VBO
        GLfloat vertexData[] = {
            //  X     Y     Z
             0.0f, 0.8f, 0.0f,
            -0.8f,-0.8f, 0.0f,
             0.8f,-0.8f, 0.0f,
        };
        glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);
    
        // connect the xyz to the "vert" attribute of the vertex shader
        glEnableVertexAttribArray(0);
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
    
        // unbind the VBO and VAO
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glBindVertexArray(0);
    }
    
    // draws a single frame
    static void Render() {
        // clear everything
        glClearColor(0, 0, 0, 1); // black
        glClear(GL_COLOR_BUFFER_BIT);
    
    
    
        // bind the VAO (the triangle)
        glBindVertexArray(gVAO);
    
        // draw the VAO
        glDrawArrays(GL_TRIANGLES, 0, 3);
    
        // unbind the VAO
        glBindVertexArray(0);
    
        // swap the display buffers (displays what was just drawn)
        glfwSwapBuffers();
    }
    
    // the program starts here
    void AppMain() {
        // initialise GLFW
        if(!glfwInit())
            throw std::runtime_error("glfwInit failed");
    
        // open a window with GLFW
        glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
        glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3);
        glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2);
        glfwOpenWindowHint(GLFW_WINDOW_NO_RESIZE, GL_TRUE);
        if(!glfwOpenWindow((int)SCREEN_SIZE.x, (int)SCREEN_SIZE.y, 8, 8, 8, 8, 0, 0, GLFW_WINDOW))
            throw std::runtime_error("glfwOpenWindow failed. Can your hardware handle OpenGL 3.2?");
    
        // initialise GLEW
        glewExperimental = GL_TRUE; //stops glew crashing on OSX :-/
        if(glewInit() != GLEW_OK)
            throw std::runtime_error("glewInit failed");
    
        // print out some info about the graphics drivers
        std::cout << "OpenGL version: " << glGetString(GL_VERSION) << std::endl;
        std::cout << "GLSL version: " << glGetString(GL_SHADING_LANGUAGE_VERSION) << std::endl;
        std::cout << "Vendor: " << glGetString(GL_VENDOR) << std::endl;
        std::cout << "Renderer: " << glGetString(GL_RENDERER) << std::endl;
    
        // make sure OpenGL version 3.2 API is available
        if(!GLEW_VERSION_3_2)
            throw std::runtime_error("OpenGL 3.2 API is not available.");
    
        // create buffer and fill it with the points of the triangle
        LoadTriangle();
    
        // run while the window is open
        while(glfwGetWindowParam(GLFW_OPENED)){
            // draw one frame
            Render();
        }
    
        // clean up and exit
        glfwTerminate();
    }
    
    
    int main(int argc, char *argv[]) {
        try {
            AppMain();
        } catch (const std::exception& e){
            std::cerr << "ERROR: " << e.what() << std::endl;
            return EXIT_FAILURE;
        }
    
        return EXIT_SUCCESS;
    }
    

    我使用glfw3改编的版本:

    #define GLEW_STATIC
    // third-party libraries
    #include <windows.h>
    #include <GL/glew.h>
    #include <GL/glfw3.h>  // --- changed
    #include <glm/glm.hpp>
    
    #include <cassert>
    #include <iostream>
    #include <stdexcept>
    
    
    GLuint gVAO = 0;
    GLuint gVBO = 0;
    GLuint programId;
    const glm::vec2 SCREEN_SIZE(800, 600);
    GLFWwindow *window;  // --- added
    
    static void LoadTriangle() {
        // make and bind the VAO
        glGenVertexArrays(1, &gVAO);
        glBindVertexArray(gVAO);
    
        // make and bind the VBO
        glGenBuffers(1, &gVBO);
        glBindBuffer(GL_ARRAY_BUFFER, gVBO);
    
        // Put the three triangle verticies into the VBO
        GLfloat vertexData[] = {
            //  X     Y     Z
             0.0f, 0.8f, 0.0f,
            -0.8f,-0.8f, 0.0f,
             0.8f,-0.8f, 0.0f,
        };
        glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);
    
        // connect the xyz to the "vert" attribute of the vertex shader
        glEnableVertexAttribArray(0);
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
    
        // unbind the VBO and VAO
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glBindVertexArray(0);
    }
    
    // draws a single frame
    static void Render(GLFWwindow *win) {  // --- changed
        // clear everything
        glClearColor(0, 0, 0, 1); // black
        glClear(GL_COLOR_BUFFER_BIT);
    
    
    
        // bind the VAO (the triangle)
        glBindVertexArray(gVAO);
    
        // draw the VAO
        glDrawArrays(GL_TRIANGLES, 0, 3);
    
        // unbind the VAO
        glBindVertexArray(0);
    
        // swap the display buffers (displays what was just drawn)
        glfwSwapBuffers(win);  // --- changed
    }
    
    // the program starts here
    void AppMain() {
        // initialise GLFW
        if(!glfwInit())
            throw std::runtime_error("glfwInit failed");
    
        // open a window with GLFW
        glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);  // --- changed
        glfwWindowHint(GLFW_VERSION_MAJOR, 3);  // --- changed
        glfwWindowHint(GLFW_VERSION_MINOR, 2);  // --- changed
        glfwWindowHint(GLFW_RESIZABLE, GL_TRUE);  // --- changed
    
        window = glfwCreateWindow((int)SCREEN_SIZE.x, (int)SCREEN_SIZE.y,"Test window",0,0);  // --- changed
    
        if(window == NULL)
            throw std::runtime_error("glfwOpenWindow failed. Can your hardware handle OpenGL 3.2?");
    
        // initialise GLEWuj
        glewExperimental = GL_TRUE; //stops glew crashing on OSX :-/
        if(glewInit() != GLEW_OK)
            throw std::runtime_error("glewInit failed");
    
        // print out some info about the graphics drivers
        std::cout << "OpenGL version: " << glGetString(GL_VERSION) << std::endl;
        std::cout << "GLSL version: " << glGetString(GL_SHADING_LANGUAGE_VERSION) << std::endl;
        std::cout << "Vendor: " << glGetString(GL_VENDOR) << std::endl;
        std::cout << "Renderer: " << glGetString(GL_RENDERER) << std::endl;
    
        // make sure OpenGL version 3.2 API is available
        if(!GLEW_VERSION_3_2)
            throw std::runtime_error("OpenGL 3.2 API is not available.");
    
        // create buffer and fill it with the points of the triangle
        LoadTriangle();
    
        // run while the window is open
        while(!glfwWindowShouldClose(window)){  // --- changed
            // draw one frame
            Render(window);  // --- changed
        }
    
        // clean up and exit
        glfwTerminate();
    }
    
    
    int main(int argc, char *argv[]) {
        try {
            AppMain();
        } catch (const std::exception& e){
            std::cerr << "ERROR: " << e.what() << std::endl;
            return EXIT_FAILURE;
        }
    
        return EXIT_SUCCESS;
    }
    

    我将-mwindows添加到链接器选项中,然后根据Dinesh在Setup Modern OpenGL page上的说明设置我的openGL环境。

    请注意Dinesh使用早期的glfw构建,因此促使我进行更改以获取编译和执行的代码。

    无论如何,构建产生了这个输出:

    === Build: Debug in OpenGLTest (compiler: GNU GCC Compiler) ===
    Warning: corrupt .drectve at end of def file
    === Build finished: 0 error(s), 1 warning(s) (0 minute(s), 5 second(s)) ===
    === Run: Debug in OpenGLTest (compiler: GNU GCC Compiler) ===
    

    所以我的问题是:警告意味着什么,我应该关注什么?

1 个答案:

答案 0 :(得分:-1)

当我遇到这个问题时,那是因为我正在链接不兼容的MSVC库。凯尔塔尔的评论帮助我解决了这个问题。

SDL 2.0:链接错误