Почему я получаю ошибку сегментации при использовании 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, я снова получаю ошибку сегментации.
Детали:
Ошибка сегментации возникает, когда
Трассировка стека для 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
Сведения о ОС:
Сведения о компиляторе
Детали OpenGL:
Подробная информация о библиотеках, используемых в тестовой программе - -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
Чувство моего чувства: причина в том, что между чистыми 64-битными библиотеками и 32-битными библиотеками.
Относительно: ошибка сегментации
Если
то ошибки сегментации уходят (прогон тестовой программы, работа 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
gdb
.