2015-06-12 12 views
0

Я пытаюсь создать приложение OpenGl. Сначала я использовал старый контур фиксированной функции для рисования. Затем я заметил, что это устарело и захотелось перейти на программируемый конвейер. Для этого я использовал некоторые учебные пособия в Интернете. После изменения моего кода я попытался скомпилировать его, но мой компилятор не смог найти функции (core profile?), Такие как glShaderSource, glCompileShader, glCreateProgram, glAttachShader, glLinkProgram и некоторые другие. Я не использую библиотеку GLFW для управления окнами или что-то подобное, но xlib.OpenGl XUbuntu 14.04 glShaderSource, glCompileShader, glCreateProgram функции не объявлены

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 и драйвер с открытым исходным кодом, но это не исправить эту проблему.

I включают 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/включать/GL/

Затем я установил файлы разработки OpenEs через:

sudo apt-get install libgles2-mesa-dev 

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

ответ

0

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

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

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

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