OpenGl XUbuntu 14.04 glShaderSource、glCompileShader、glCreateProgram 函数未声明
OpenGl XUbuntu 14.04 glShaderSource, glCompileShader, glCreateProgram functions not declared
我正在尝试构建 OpenGl 应用程序。首先,我使用旧的固定功能管道进行绘图。然后我注意到这已经过时了,想切换到可编程流水线。为此,我使用了网络上的一些教程。更改我的代码后,我尝试编译它,但我的编译器找不到(核心配置文件?)函数,如 glShaderSource、glCompileShader、glCreateProgram、glAttachShader、glLinkProgram 等。我没有将 GLFW 库用于 window 管理或类似的东西,而是 xlib。
glx信息 | 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 driver 和开源的 driver,但这并没有解决问题。
我通过以下方式包含 OpenGl headers:
#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 driver 的 header 文件吗?
已解决:
我必须从这里下载 gl3.h header 文件: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 定义的函数必须(我重复 必须)在运行时动态解析并测试可用性。如果您不这样做,您的程序 最终将 在其他人的系统上中断。
解析符号的相关函数是glXGetProcAddress
(或wglGetProcAddress
分别在Windows)。 不要 启用 gl3.h
的原型定义......只有痛苦和苦难才能走下去。相反,为了确保工作安全,请使用经过适当测试的 OpenGL 加载程序库,例如 GLEW(有很多问题)或 glLoadGen/glload(我建议使用后者)。
我正在尝试构建 OpenGl 应用程序。首先,我使用旧的固定功能管道进行绘图。然后我注意到这已经过时了,想切换到可编程流水线。为此,我使用了网络上的一些教程。更改我的代码后,我尝试编译它,但我的编译器找不到(核心配置文件?)函数,如 glShaderSource、glCompileShader、glCreateProgram、glAttachShader、glLinkProgram 等。我没有将 GLFW 库用于 window 管理或类似的东西,而是 xlib。
glx信息 | 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 driver 和开源的 driver,但这并没有解决问题。
我通过以下方式包含 OpenGl headers:
#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 driver 的 header 文件吗?
已解决:
我必须从这里下载 gl3.h header 文件: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 定义的函数必须(我重复 必须)在运行时动态解析并测试可用性。如果您不这样做,您的程序 最终将 在其他人的系统上中断。
解析符号的相关函数是glXGetProcAddress
(或wglGetProcAddress
分别在Windows)。 不要 启用 gl3.h
的原型定义......只有痛苦和苦难才能走下去。相反,为了确保工作安全,请使用经过适当测试的 OpenGL 加载程序库,例如 GLEW(有很多问题)或 glLoadGen/glload(我建议使用后者)。