我试图理解为什么这个程序将用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证明是一件非常重要的事情。
答案 0 :(得分:6)
正如我所评论的那样,在include指令之前放置#define GL_GLEXT_PROTOTYPES
可以解决您的问题。
通常,原型存在于头文件中,但由于条件编译而不可见。要定义原型和typedef,应用程序必须在包含gl.h或glx.h之前#define GL_GLEXT_PROTOTYPES。 (注意:一致性建议使用GLX_GLXEXT_PROTOTYPES作为glxext.h - TBD)。
这通常是通过头文件中的GLUT
或GLEW
来完成的,所以如果你正在使用它们,通常不需要自己定义宏 - 但是一定要包括 GL/gl.h
已编辑:glBegin
在glUseProgram
出现问题时工作正常的原因是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之类的内容。为什么?因为默认情况下,所有GL函数都不会被称为glUseProgram
等。默认情况下,在我的计算机上(Windows7)glUseProgram()
实际上称为PFNGLUSEPROGRAMPROC
。
从而将那些“丑陋”的东西换成更具可读性的东西,只需获得GLEW。
你也可以简单地#define
所有那些“丑陋”的东西,尽管这将是很多工作。所以再次获得像GLEW这样的东西会更容易。