Во время игры с многократной инициализацией и завершением GLFW, Я столкнулся с segfault. Вот минимальная программа на C ++, которая иллюстрирует мою проблему:
#include <iostream>
#include <GLFW/glfw3.h>
int main() {
glfwInit();
// glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
glfwCreateWindow(1, 1, "", NULL, NULL);
glfwTerminate();
std::cout << "before" << std::endl;
glfwInit();
std::cout << "after" << std::endl;
glfwTerminate();
}
Если я раскомментирую звонок glfwWindowHint
, программа работает нормально:
$ g++ glfw_segfault.cpp `pkg-config --static --libs glfw3`
$ ./a.out
before
after
Тем не менее, без этого вызова я получаю segfault:
$ g++ glfw_segfault.cpp `pkg-config --static --libs glfw3`
$ ./a.out
before
Segmentation fault (core dumped)
Досадно, что segfault происходит только в некоторых случаях, когда я запускаю вышеуказанную программу. В других случаях я не получаю segfault, и программа работает точно так, как я ожидал. Я также перевел приведенный выше код на C и не смог воспроизвести ошибку.
Когда я впервые столкнулся с этой проблемой, я использовал Clojure а также ботинок:
#!/usr/bin/env boot
(set-env!
:dependencies
(let [lwjgl-version "3.0.0"]
[['org.lwjgl/lwjgl lwjgl-version]
['org.lwjgl/lwjgl-platform lwjgl-version :classifier "natives-linux"]]))
(import (org.lwjgl.glfw GLFW)
(org.lwjgl.system MemoryUtil))
(defn -main []
(GLFW/glfwInit)
;; (GLFW/glfwWindowHint GLFW/GLFW_CLIENT_API GLFW/GLFW_NO_API)
(GLFW/glfwCreateWindow 1 1 "" MemoryUtil/NULL MemoryUtil/NULL)
(GLFW/glfwTerminate)
(println "before")
(GLFW/glfwInit)
(println "after")
(GLFW/glfwTerminate))
Как и раньше, если я раскомментирую glfwWindowHint
звоните, проблем нет
$ chmod +x glfw_segfault
$ ./glfw_segfault
before
after
Если я оставлю вызов, я получу сегфо. Эта программа Clojure создала для меня сегфофт более надежно, чем приведенная выше программа на C ++, но не всегда. В частности, когда я использую интегрированную графику Haswell Intel HD, у меня не возникает ошибка по умолчанию. Тем не менее, когда я использую nvidia-settings
Чтобы переключиться на NVIDIA GeForce GT 750M с драйвером NVIDIA 367.35, я всегда получаю ошибку segfault.
Это ошибка в GLFW, или я просто неправильно ее использую? В последнее мне трудно поверить, потому что согласно документации для glfwTerminate
, поддерживается инициализация и завершение библиотеки несколько раз:
Как только эта функция вызвана, вы должны снова вызвать
glfwInit
успешно, прежде чем вы сможете использовать большинство функций GLFW.
Мне кажется, что проблема как-то связана с GLFW_CLIENT_API
подсказка окна, но я не могу понять, что это может быть. Поскольку это похоже на ошибку, я открыл вопрос на GitHub.
Задача ещё не решена.
Других решений пока нет …