在反复初始化和终止GLFW时,我遇到了一个段错误。这是一个最小的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
然而,没有那个电话,我得到一个段错误:
$ g++ glfw_segfault.cpp `pkg-config --static --libs glfw3`
$ ./a.out
before
Segmentation fault (core dumped)
令人讨厌的是,段错误只发生在我运行上述程序的某些时候。其他时候,我没有得到段错误,程序运行完全如我所料。我还将上面的代码翻译成了C,并且无法重现段错误。
#!/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 Graphics时,我不会遇到段错误。但是,当我使用nvidia-settings
切换到运行NVIDIA 367.35驱动程序的NVIDIA GeForce GT 750M时,我总是遇到段错误。
这是GLFW中的错误,还是我只是错误地使用它?我发现后者有点难以置信,因为根据glfwTerminate
的文档,支持多次初始化和终止库:
调用此函数后,必须再次成功调用
glfwInit
才能使用大多数GLFW函数。
在我看来,问题与GLFW_CLIENT_API
窗口提示有关,但我无法弄清楚它可能是什么。因为这似乎是一个错误,我在GitHub上打开了issue。