OpenGl XUbuntu 14.04 glShaderSource, glCompileShader, glCrea

OpenGl XUbuntu 14.04 glShaderSource, glCompileShader, glCreateProgram functions not declared

本文关键字:glCompileShader glCrea glShaderSource XUbuntu OpenGl      更新时间:2023-10-16

我正在尝试构建一个OpenGl应用程序。首先,我使用旧的固定函数管道进行绘制。然后我注意到这已经过时了,想切换到可编程管道。为此,我在网上使用了一些教程。更改代码后,我尝试编译它,但我的编译器找不到(核心配置文件?)函数,如glShaderSource,glCompileShader,glCreateProgram,glAttachShader,glLinkProgram等等。我不使用 GLFW 库进行窗口管理或类似的东西,而是使用 xlib。

glxinfo | grep OpenGl 正在打印以下内容:

OpenGL vendor string: NVIDIA Corporation
OpenGL renderer string: GeForce GTX 675M/PCIe/SSE2
OpenGL core profile version string: 4.3.0 NVIDIA 331.113
OpenGL core profile shading language version string: 4.30 NVIDIA via Cg compiler
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 4.4.0 NVIDIA 331.113
OpenGL shading language version string: 4.40 NVIDIA via Cg compiler
OpenGL context flags: (none)
OpenGL profile mask: (none)
OpenGL extensions:

我尝试了专有的 Nvidia 驱动程序和开源驱动程序,但这并没有解决问题。

我通过以下方式包含 OpenGl 标头:

#include <GL/gl.h>
#include <GL/glx.h>

下面是一些编译错误输出:

In file included from main.cpp:1:0:
../../gui/iml/app.window.h: In constructor    ‘gui::iml::AppWindow::AppWindow()’:
../../gui/iml/app.window.h:65:52: error: ‘glCreateShader’ was not declared in this scope
    fragmentShader = glCreateShader(GL_VERTEX_SHADER);
                                                ^
../../gui/iml/app.window.h:66:47: error: ‘glShaderSource’ was not declared in this scope
    glShaderSource(vertexShader,1,&vshader,NULL);
                                           ^
../../gui/iml/app.window.h:67:32: error: ‘glCompileShader’ was not declared in this scope
    glCompileShader(vertexShader);
                            ^
../../gui/iml/app.window.h:72:38: error: ‘glCreateProgram’ was not declared in this scope
    GLuint sprogram = glCreateProgram();
                                  ^
../../gui/iml/app.window.h:73:50: error: ‘glAttachShader’ was not declared in this scope
    glAttachShader(this->shaderProg,fragmentShader);
                                              ^
../../gui/iml/app.window.h:75:34: error: ‘glLinkProgram’ was not declared in this scope
    glLinkProgram(this->shaderProg);

编译测试程序,我为调试而创建,如下方式:

g++ -Wall -Winline -DDEBUG main.cpp -I ../../gui/ -o debug -lX11 -lGL -lGLU -pthread -std=c++11

我想我犯了一个简单而愚蠢的错误,但我不明白......

编辑:我查看了我的gl.h文件,它看到它是Mesa项目:

/*
 * Mesa 3-D graphics library
 *
 * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
 * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
 * 

这不应该是 Nvidia 驱动程序的头文件吗?

已解决

我必须从这里下载gl3.h头文件:https://www.khronos.org/registry/gles/api/old/3.0/gl3.h 并将其移动到/usr/include/GL/

然后我通过以下方式安装了 OpenEs 开发文件:

sudo apt-get install libgles2-mesa-dev

现在程序编译了!

虽然你的问题可能表面上消失了,但你实际上并没有解决根本原因(至少如果你的目标是 LSB4 合规性,纯粹是运气,只使用 glShader......您的程序实际上符合 LSB5 的函数)。

您遇到的问题是,Linux 标准库 (LSB) 仅将 OpenGL-1.2 定义为要包含在系统 ABI 中的强制性函数集。 *任何超出 OpenGL-1.2 的符号都不是 Linux 桌面系统上允许的标准功能集的一部分。最近LSB5发布,它将要求提高到OpenGL-2.1。

无论如何,任何超出 LSB 中定义的函数都必须(我重复 MUST)在运行时动态解析并测试可用性。如果你不这样做,你的程序最终会在其他人的系统上崩溃。

用于解析符号的相关函数glXGetProcAddress(或分别在 Windows 上wglGetProcAddress)。不要启用gl3.h的原型定义...只有痛苦和苦难在这条路上。相反,为了保护自己的工作,请使用经过适当测试的OpenGL加载程序库,如GLEW(有其相当多的问题)或glLoadGen/glload(我建议使用后者)。