0

代码没有问题,因为当我告诉编译器将其编译为 C 时它会编译,但当我将设置设置为默认值时它不会编译(即编译为 C++)。当我将它编译为 C++ 时,我收到许多错误,例如“未定义对 glClear 的引用”

我正在使用微软的 Visual Studio C++ 编译器。我把所有东西都正确链接了。

代码是:

#include <GL/glut.h>
#include <GL/freeglut.h>
#include <GL/gl.h>



void display(void)
{
    /* Clear all pixels */
    glClear(GL_COLOR_BUFFER_BIT);

    /*  draw white polygon (rectangle) with
     *  corners at (0.25, 0.25, 0.0) and (0.75, 0.75, 0.0)
     */

    glColor3f(1.0, 1.0, 1.0);
    glBegin(GL_POLYGON);
        glVertex3f(0.25, 0.25, 0.0);
        glVertex3f(0.75, 0.25, 0.0);
        glVertex3f(0.75, 0.75, 0.0);
        glVertex3f(0.25, 0.75, 0.0);
    glEnd();

    /*  don't wait!
     *  start processing buffered OpenGL routines
     */

        glFlush();
}

void init(void)
{
    /* Select clearing background color */
    glClearColor(0.0, 0.0, 0.0, 0.0);

    /* Initialize viewing values */
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
}


/*
* Declare initial window size, position, and display mode
* (single buffer and RGBA). Open window with “hello”
* in its title bar. Call initialization routines.
* Register callback function to display graphics.
* Enter main loop and process events.
*/
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(250, 250);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("hello");
    init();
    glutDisplayFunc(display);
    glutMainLoop();
    return 0; /* ISO C requires main to return int. */
}

另外,如果有人有合适的资源来学习使用 C++ 的 opengl,你能推荐一下吗?

4

2 回答 2

2

这可能是因为glClear在当前包含的任何头文件中都没有声明。在 C 中,通常假定未声明的函数具有基于其参数的特定类型,并返回一个int. 因此,当使用 C 编译时,您可能会收到关于它未声明的警告(我希望您启用了警告,并在编译时阅读它们?),但它会尽力编译和链接它。

C++ 对未声明的函数更加严格。

于 2012-04-26T03:45:23.857 回答
1

正如 Alexadre Jasmin 和 Bart 所指出的,验证您是否正确链接了 OpenGL 库。我用

-lGLU -lGL -lglut
在 ubuntu 上使用 freeglut。

如果这不能解决问题,请尝试添加

#define GLUT_DISABLE_ATEXIT_HACK
在您的 cpp 文件的顶部。

于 2012-04-26T04:12:42.777 回答