GLEW 1.10.0 Ошибка сегментации

0

Почему я получаю ошибку сегментации при использовании GLEW 1.10.0? (Я представил детали моей системы в нижней части вопроса.)

Я загрузил и скомпилировал GLEW. Компиляция (make all) и установка (sudo make install.all) работают и не показывают ошибок. GLEW lib установлен в /usr/lib64/libGLEW.so.1.10.0.

Я создаю простую тестовую программу OpenGL (см. Ниже), которая использует GLEW и glfw3 (3.0.3). Когда программа использует установленную библиотеку GLEW, возникает ошибка сегментации. Когда я использую исходный код GLEW в своей тестовой программе, программа работает.

Однако, если я загружаю шейдеры и затем запрашиваю скомпилированную программу OpenGL с помощью glGetProgramInterfaceiv, я снова получаю ошибку сегментации.


Детали:

Ошибка сегментации возникает, когда

  1. бег glewinfo
  2. запуск visualinfo
  3. тестовая программа (подробности ниже)
  4. вызов glGetProgramInterfaceiv (подробнее см. ниже)

Трассировка стека для glewinfo с помощью gdb

#0  0x00007ffff6d5fca0 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00007ffff51b32f6 in __driCreateNewScreen_20050727 () from /usr/lib/x86_64-linux-gnu/dri/fglrx_dri.so
#2  0x00007ffff7557c92 in ?? () from /usr/lib64/libGL.so.1
#3  0x00007ffff7553ea1 in ?? () from /usr/lib64/libGL.so.1
#4  0x00007ffff75540ce in glXChooseVisual () from /usr/lib64/libGL.so.1
#5  0x0000000000454883 in glewCreateContext ()
#6  0x000000000043b224 in main ()

Трассировка стека для visualinfo с использованием gdb

#0  0x00007ffff6d5fca0 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00007ffff51b32f6 in __driCreateNewScreen_20050727 () from /usr/lib/x86_64-linux-gnu/dri/fglrx_dri.so
#2  0x00007ffff7557c92 in ?? () from /usr/lib64/libGL.so.1
#3  0x00007ffff7553ea1 in ?? () from /usr/lib64/libGL.so.1
#4  0x00007ffff75540ce in glXChooseVisual () from /usr/lib64/libGL.so.1
#5  0x000000000040237b in CreateContext ()
#6  0x000000000040103e in main ()

Ниже приведена тестовая программа, в которой используется установленная библиотека GLEW и glfw3 (3.0.3)

#include <GL/glew.h> 
#include <GLFW/glfw3.h> 
int main()
{
glfwInit();
GLFWwindow* window = glfwCreateWindow(640, 480, "Hello World", NULL,
NULL);
glfwMakeContextCurrent(window);
glewInit();
glfwTerminate();
}

Скомпилировать:

g++ -o "Basic" "main.cpp" -lglfw3 -lGLEW -lGL -lX11 -lrt -lXxf86vm -lXrandr

Перед запуском. /Basic я установил

export LD_LIBRARY_PATH=/usr/local/lib:/usr/lib64

(иначе он не может найти GLEW lib, который живет в /usr/lib64)

Программа дает ошибку сегментации. Если я запускаю программу через eclipse или при использовании gdb, трассировка стека:

Thread [1] 16728 [core: 2] (Suspended : Signal : SIGSEGV:Segmentation fault)    
0x7ffff65e5ca0  
__driCreateNewScreen_20050727() at 0x7ffff3de52f6   
0x7ffff7645c92  
glXQueryVersion() at 0x7ffff763d0aa 
_glfwInitContextAPI() at 0x40c580   
_glfwPlatformInit() at 0x408855 
glfwInit() at 0x404829  
main() at main.cpp:7 0x403819   

Использование gdb дает обратную трассировку

#0  0x00007ffff65e5ca0 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00007ffff3de52f6 in __driCreateNewScreen_20050727 () from /usr/lib/x86_64-linux-gnu/dri/fglrx_dri.so
#2  0x00007ffff7980c92 in ?? () from /usr/lib64/libGL.so.1
#3  0x00007ffff79780aa in glXQueryVersion () from /usr/lib64/libGL.so.1
#4  0x000000000040c580 in _glfwInitContextAPI ()
#5  0x0000000000408855 in _glfwPlatformInit ()
#6  0x0000000000404829 in glfwInit ()
#7  0x0000000000403819 in main ()

Когда не используется библиотека GLEW, но исходный код (glew.h и glew.c), программа работает. Для этого я могу изменить первый

#include <glew.h>

При связывании этого времени я использую библиотеку Xi (-lXi). Команды g++ для компиляции и компоновки программы:

g++ -I"./" -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -MMD -MP -MF"main.d" -MT"main.d" -o "main.o" "main.cpp"
g++ -I"./" -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -MMD -MP -MF"glew.d" -MT"glew.d" -o "glew.o" "glew.c"
g++ -o Basic ./glew.o ./main.o -lGL -lX11 -lXrandr -lXxf86vm -lrt -lglfw3 -lXi

Перед запуском. /Basic я установил

export LD_LIBRARY_PATH=/usr/local/lib

(в противном случае я получаю ошибку сегментации, потому что он пытается использовать установленный GLEW lib). Эта программа не бросает ошибку сегментации. Программа также работает с использованием eclipse.


Подробности при вызове glGetProgramInterfaceiv (программа GL_PROGRAM_OUTPUT, GL_ACTIVE_RESOURCES и выходы);

В приведенную выше тестовую программу я добавляю код для загрузки шейдеров вершин и фрагментов. Я компилирую шейдеры в программу. Все это работает. Вызов glGetShaderInfoLog работает и печатает журнал. Когда я добавляю строку кода, которая вызывает glGetProgramInterfaceiv, программа дает ошибку сегментации. Использование glewExperimental = GL_TRUE; не помогает.

При использовании gdb я не могу получить приличную трассировку стека. Это то, что дает gdb:

(gdb) backtrace
#0  0x0000000000000000 in ?? ()
#1  0x000000000042ec18 in main () at ../main.cpp:54

Сведения о ОС:

  • Linux: 3.2.0-4-amd64
  • Distro: Debian 7.3 Wheezy
  • uname -m: x86_64
  • /proc/cpuinfo → параметр flags → значение lm присутствует

Сведения о компиляторе

  • g++ --version: g++ (Debian 4.7.2-5) 4.7.2

Детали OpenGL:

  • Поставщик OpenGL: усовершенствованные микроустройства (из Центра управления AMD Catalyst)
  • OpenGL Renderer: AMD Radeon HD 7600M Series (из Центра управления AMD Catalyst)
  • OpenGL Версия: 4.2.11762 Контекст профиля совместимости (из Центра управления AMD Catalyst)
  • glxinfo:
  • строка версии сервера glx: 1.4
  • строка версии glx клиента: 1.4
  • Версия GLX: 1.4
  • Версия версии OpenGL: 4.2.11762 Контекст профиля совместимости
  • Строка версии языка затенения OpenGL: 4.20
  • серверная строка glx: ATI
  • клиентская строка поставщика glx: ATI

Подробная информация о библиотеках, используемых в тестовой программе - -lglfw/usr/local/lib/libglfw3.a 3.0.3

  • -lGL есть 2 в моей системе libGL.so.1.2 ->/usr/lib64/fglrx/fglrx-libGL.so.1.2 и libGL.so.1.2 ->/usr/lib/i386-linux-gnu/fglrx/fglrx-libGL.so.1.2

  • -lX11/usr/lib/x86_64-linux-gnu/libX11.so.6.3.0

  • -lrt/usr/lib/x86_64-linux-gnu/librt.so ->/lib/x86_64-linux-gnu/librt.so.1 ->/lib/x86_64-linux-gnu/librt.so.1 - >/lib/x86_64-linux-gnu/librt-2.13.so

  • -lXrandr/usr/lib/x86_64-linux-gnu/libXrandr.so.2 → libXrandr.so.2.2.0

  • -lXxf86vm/usr/lib/x86_64-linux-gnu/libXxf86vm.so.1 → libXxf86vm.so.1.0.0

  • -lXi/usr/lib/x86_64-linux-gnu/libXi.so.6 → libXi.so.6.1.0

  • 1
    Вы должны использовать отладчик gdb .
  • 0
    Я добавил след от GDB. Как еще может помочь GDB?
Показать ещё 3 комментария
Теги:
opengl
glfw
glew

1 ответ

0

Чувство моего чувства: причина в том, что между чистыми 64-битными библиотеками и 32-битными библиотеками.

Относительно: ошибка сегментации

Если

  1. переместите libGLEW из /usr/lib64 (например, в папку /tmp) и
  2. затем, например, экспортируйте LD_LIBRARY_PATH =/tmp (вместо экспорта LD_LIBRARY_PATH =/usr/lib64)

то ошибки сегментации уходят (прогон тестовой программы, работа glewinfo и visualinfo)

Проблема в /usr/lib64 вызывает проблему.

Я наткнулся на эту страницу AMD 13.1 64-разрядных драйверов и ошибку libGL.so.1, которая объясняет, где установщик AMD помещает файл libGL.so

установщик помещает файлы lib в /usr/lib64. Однако, если у вас есть Ubuntu, 64-битные библиотеки идут в /usr/lib. Я сделал следующее, чтобы исправить мою проблему.

Удалите драйвер sudo./amd-driver-installer-catalyst-13.1-legacy-linux-x86.x86_64.run --uninstall

Удалите папку /usr/lib64 sudo rm -Rf/usr/lib64

Создайте символическую ссылку /usr/lib64, которая указывает на /lib/usr sudo ln -s/usr/lib/usr/lib64

Установите драйвер снова sudo./amd-driver-installer-catalyst-13.1-legacy-linux-x86.x86_64.run --force

Перезагрузка sudo reboot

Я не уверен, что эта символическая ссылка - хорошая идея или нет...


По вопросу: glGetProgramInterfaceiv (GLAPI/glGetProgramInterface)

не работает, потому что он доступен только OpenGL> = 4.3. Моя карта - 4.2. Запуск glewinfo также показывает следующее:

GL_ARB_program_interface_query:                                MISSING 
-------------------------------
glGetProgramInterfaceiv:                                     MISSING
glGetProgramResourceIndex:                                   MISSING
glGetProgramResourceLocation:                                MISSING
glGetProgramResourceLocationIndex:                           MISSING
glGetProgramResourceName:                                    MISSING
glGetProgramResourceiv:                                      MISSING

Ещё вопросы

Сообщество Overcoder
Наверх
Меню