在不将 cygwin X11 GLX 与 WGL 混合的情况下,在 cygwin32 中使用 mingw32 glfw3 和 glew32s 二进制文件

Using mingw32 glfw3 and glew32s binaries in cygwin32 without mixing cygwin X11 GLX with WGL

我想使用 cygwin32 编译器而不是 mingw32。根据 http://web.eecs.umich.edu/~sugih/courses/eecs487/glut-howto/glfw/ ,cygwin 上 gl 的 GLX 程序不适用于 glfw。因此,我尝试在 cygwin32 中使用 glfw3 的 mingw32 二进制文件,这给出了类似 'GL_ARRAY_BUFFER' was not declared in this scope 的错误。我通过链接 glew32 的 mingw32 二进制文件解决了这个问题,它给出了

/usr/include/w32api/GL/glu.h:68:79: 错误:'*' 标记前应为 ')'

我用两种不同的方法解决了,一种是使用 cygwin 安装的 glew,另一种是链接到 glew32s 并粘贴

#ifndef CALLBACK
#if defined(_ARM_)
#define CALLBACK
#else
#define CALLBACK __stdcall
#endif
#endif

#define GLEW_STATIC

如果我使用 glew32 而不是 glew32s,它会说对 'glewInit' 的未定义引用,我需要在 glCreateShader 之前和 glfwMakeContextCurrent 之后停止段错误。但是这个方法给出了 Warning: resolving _glewInit by linking to _glewInit@0.

毕竟,我得到了很多错误,比如对 'glGenTextures' 或 'glDrawElements' 的未定义引用,我只能通过链接到 cygwin 的 gl 来解决,我认为它是混合 GLX 和 WGL . 根据 glewInit() fails with "Missing GL version", SDL2 OpenGL context, cygwin compiler,我应该切换到我已经在使用的 mingw32 编译器,但我真的想使用 cygwin。

如果我将 cygwin 的 gl (-lGL) 与 glew32s 一起使用,它会编译、运行,并在我的 glGenBuffers(1, &ibo) 中使用堆栈转储进行段错误;在我的模型中 class 没有 glewinit() 给出任何错误。

model(vectx* vecticesd, unsigned int* indicesd,int vectsized,int indsized,GLuint texidd) :
vecticesarr(vecticesd), indicesarr(indicesd),texid(texidd),vectsize(vectsized),indsize(indsized){
    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, vectsized, vecticesarr, GL_STATIC_DRAW);
    glGenBuffers(1, &ibo);                      //here it crashes
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, indsized, indicesd, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}

如果我改用 cygwin 的 glew,glewinit() returns 错误 "Missing GL version"。 glfwMakeContextCurrent(window);在 glewinit(); 之前被调用。 这是我的链接器并将它们加倍,所以顺序无关紧要,没有改变任何东西。

 -lglfw3 -lglew32s -lopengl32 -lgdi32 -lGL

我用 cygwin64 尝试了 mingw64 二进制文件,它给出了“___vsnprintf 未找到”并且 -lntdll 没有修复它。

--添加了更多信息--

我是编程新手,所以如果我说的很蠢,请原谅我。对于测试用例,请使用 https://www.glfw.org/docs/3.0/quick.html 处的代码。我的 cygwin32 构建设置得到一个黑色 window,我的 mingw32 构建设置得到一个旋转三角形。如果重要的话,我在 windows 上使用 sublime text。我可以使用预编译的二进制文件从 glfw 网站下载 mingw32,还是必须将 cmake 与 cygwin 一起使用?当我通过将 cygwin/bin 添加到环境系统变量路径来尝试使用 cygwin 进行 cmake 时,它​​说 "Using Win32 for window creation",cygwin/bin/make.exe 和 gnu windows make说

[ 16%] 链接 C 可执行文件 boing.exe ../src/glfw3.lib(win32_monitor.c.obj):win32_monitor.c:(.text+0x77): 未定义对“_imp__CreateDCW@16”的引用 ...更多错误

如果我进入 glfw 源代码中的 cmakelist.txt 并强制它使用 X11,它说 "Using X11 for window creation" 然后说 X11/extensions/xf86vmode.h 丢失并且没有'在 cygwin 的 setup-x86.exe 中没有一个包。我可能对 cmake 做了一些非常错误的事情,但我不知道。我能够使用 mingw32 作为环境系统变量路径中的本机编译器进行 cmake、make 和 make install。

我怀疑你使用了错误的库所以这里是一步一步 关于如何在 Cygwin 上执行此操作。 您当然需要安装 cmake、make、libGL-devel、xinit 和 xwin-xdg-menu

到 运行 Xserver 和 X 终端

它会在任务栏上显示两个图标,选择绿色的 X 和 运行 Xterm.

编译:
从下载源 https://www.glfw.org/download.html

$ unzip glfw-3.2.1.zip
$ cd glfw-3.2.1
$ cmake -DBUILD_SHARED_LIBS=ON .
$ make
$ make install
$ mv /usr/local/lib/cygglfw-3.dll /usr/local/bin/cygglfw-3.dll

需要 mv,因为 Cygwin 上共享库的正确位置是 bin 目录 之后可以使用

编译示例
$ gcc simple.c -o simple -lglfw -lgl  -L/usr/local/lib

和 运行 在 Xterminal 中

$ ./simple.exe

这是快照

构建所有示例:

$ cd examples
$ cmake .
$ make

而且都是按个数构建的

$ ls *.exe
boing.exe  heightmap.exe  simple.exe     wave.exe
gears.exe  particles.exe  splitview.exe