为什么调用glfwCreateWindow,然后调用glfwTerminate,然后glfwInit会导致段错误?

时间:2016-08-02 21:01:05

标签: c++ linux clojure segmentation-fault glfw

在反复初始化和终止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,并且无法重现段错误。

当我最初遇到此问题时,我使用的是ClojureBoot

#!/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

0 个答案:

没有答案