如何在C ++程序中使用gl.h?

时间:2013-12-05 09:01:04

标签: c++ opengl

我试图理解为什么这个程序将用C语言编译但不能用C ++编译,为什么extern "C" { }似乎没有帮助。

这个简短的程序实际上并没有做任何事情,但是通过示例说明编译时C和C ++之间存在差异。

    #include <GL/gl.h>
    int main() {
        glBegin(GL_POLYGON);
        glUseProgram(0);
        glEnd();
        return 0;
    }

当您将其保存为ex.c并使用gcc ex.c -lGL -o ex进行编译时,它会按预期编译和链接。

当您将其保存为ex.cpp并使用gcc ex.cpp -lGL -o ex进行编译时,会出现编译器错误:

error: ‘glUseProgram’ was not declared in this scope

请注意,它不会抱怨glBegin,glEnd或GL_POLYGON。实际上,你可以注释掉glUseProgram行,它可以很好地编译为cpp程序。

现在,为什么我不能像extern "C"这样包装程序:

    extern "C" {
        #include <GL/gl.h>
        int main() {
            glBegin(GL_POLYGON);
            glUseProgram(0);
            glEnd();
            return 0;
        }
    }

这样做仍然会导致相同的编译器错误。我对extern "C"的理解不完整。

最终我需要了解错误是什么,因为我正在尝试编写一个C ++程序,该程序使用许多显然无法在C ++中编译的GL函数。

如何在C ++程序中使用gl.h?


解决一些评论:我在X11上使用Mesa。 glUseProgram定义在glext.h中,它通过gl.h包含在内。我已经在raspi上使用OpenGL(实际上是GLES)编写了一个C ++程序。将它转换为X11证明是一件非常重要的事情。

3 个答案:

答案 0 :(得分:6)

正如我所评论的那样,在include指令之前放置#define GL_GLEXT_PROTOTYPES可以解决您的问题。

请参阅the OpenGL ABI for Linux

  

通常,原型存在于头文件中,但由于条件编译而不可见。要定义原型和typedef,应用程序必须在包含gl.h或glx.h之前#define GL_GLEXT_PROTOTYPES。 (注意:一致性建议使用GLX_GLXEXT_PROTOTYPES作为glxext.h - TBD)。

这通常是通过头文件中的GLUTGLEW来完成的,所以如果你正在使用它们,通常不需要自己定义宏 - 但是一定要包括 GL/gl.h

之前的标题

已编辑glBeginglUseProgram出现问题时工作正常的原因是glBegin附带了初步的OpenGL草稿{{1}曾经是一个扩展,直到OpenGL 2.0才被引入。

<强>编辑:
让我们更具体一点:为什么它适用于C但不适用于C ++?首先,C或C ++版本中都没有定义glUseProgram。您可以使用以下代码来测试它:

GL_GLEXT_PROTOTYPES

然而,原因是在C中允许函数的符号根本没有定义(假设它的所有参数都是int并且也返回一个int),而在C ++中它是不允许的。 / p>

答案 1 :(得分:3)

让它运作的最快方法是在GL_GLEXT_PROTOTYPES包括之前定义gl.h

#define GL_GLEXT_PROTOTYPES
#include <GL/gl.h>

为了公开函数原型。

它在没有原型(函数声明)的情况下仍然在C中工作的原因是因为C不像C ++那样严格需要关于被调用函数的函数声明(它隐含地假定int fun()函数声明)。

答案 2 :(得分:0)

您需要做的第一件事是检查您是否拥有各种gl标头文件。如果您已经拥有它们,请检查您是否拥有所需的本机文件(.dll),并确保将它们加载到您的程序/项目中。

获取GLEW(OpenGL扩展牧马人库)

为了您自己,请使用GLEW之类的内容。为什么?因为默认情况下,所有GL函数都不会被称为glUseProgram等。默认情况下,在我的计算机上(Windows7)glUseProgram()实际上称为PFNGLUSEPROGRAMPROC

从而将那些“丑陋”的东西换成更具可读性的东西,只需获得GLEW。

你也可以简单地#define所有那些“丑陋”的东西,尽管这将是很多工作。所以再次获得像GLEW这样的东西会更容易。