OpenGl XUbuntu 14.04: функции glShaderSource, glCompileShader, glCreateProgram не объявлены

Я пытаюсь создать приложение 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

и теперь программа компилируется!

0

Решение

Несмотря на то, что ваша проблема может исчезнуть на первый взгляд, вы на самом деле не решили основную причину (по крайней мере, если вы стремитесь к соответствию LSB4, из чистой удачи, используя только функции glShader…, ваша программа фактически соответствует LSB5).

Проблема, с которой вы сталкиваетесь, заключается в том, что База стандартов Linux (LSB) определяет только OpenGL-1.2 в качестве обязательного набора функций, включаемых в системный ABI. * Любой символ, выходящий за пределы OpenGL-1.2, не является частью стандартного набора функций, которые вы можете ожидать в настольной системе Linux. Недавно был выпущен LSB5, что повышает требования к OpenGL-2.1.

Во всяком случае, любая функция, которая находится за пределами того, что определено в LSB должен (Я повторяю ДОЛЖЕН) разрешаться динамически во время выполнения и проверяться на доступность. Если вы этого не сделаете, ваша программа будут сломаться на чужих системах в конце концов.

Соответствующие функции для разрешения символов glXGetProcAddress (или же wglGetProcAddress соответственно на винде). Не делайте включить определение прототипа gl3.h… только боль и страдания идут по этому пути. Вместо этого, чтобы обезопасить себя, используйте должным образом протестированную библиотеку загрузчика OpenGL, такую ​​как GLEW (имеет много проблем) или glLoadGen / glload (Я рекомендую использовать позже).

0

Другие решения


По вопросам рекламы [email protected]