在cygwin32中使用mingw32 glfw3和glew32s二进制文件,而无需将cygwin X11 GLX与WGL混合使用

时间:2018-12-17 21:35:49

标签: cygwin linker-errors glfw glew

我想使用cygwin32编译器而不是mingw32。根据{{​​3}},cygwin上的gl的GLX程序不适用于glfw。因此,我尝试在cygwin32中使用glfw3的mingw32二进制文件,它给出了类似“ GL_ARRAY_BUFFER”的错误,但未在此范围内声明。我通过链接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之后停止segfault。但是此方法给出了警告:通过链接到_glewInit @ 0来解决_glewInit。

毕竟,我遇到了很多错误,例如未定义引用'glGenTextures'或'glDrawElements',这些错误只能通过链接到cygwin的gl来解决,我认为这是将GLX与WGL混合使用。 根据 http://web.eecs.umich.edu/~sugih/courses/eecs487/glut-howto/glfw/,我应该切换到已经使用过的mingw32编译器,但是我真的想使用cygwin。

如果我将cygwin的gl(-lGL)与glew32s一起使用,它将在我的glGenBuffers(1,&ibo);上通过stackdump进行编译,运行和segfaults。在我的模型类中没有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()返回错误“ Missing GL version”。 glfwMakeContextCurrent(window);在glewinit();之前被称为。 这是我的链接器,并将它们加倍,因此顺序无关紧要,没有任何改变。

 -lglfw3 -lglew32s -lopengl32 -lgdi32 -lGL

我用cygwin64尝试了mingw64二进制文件,并且给出了“ ___vsnprintf not found”,而-lntdll无法修复它。

-添加了更多信息-

我是编程的新手,所以如果我说什么很愚蠢,请原谅我。对于测试用例,请使用glewInit() fails with "Missing GL version", SDL2 OpenGL context, cygwin compiler处的代码。我的cygwin32构建设置得到一个黑色的窗口,而我的mingw32构建设置得到一个旋转的三角形。如果重要的话,我在Windows上使用了崇高的文字。我可以使用从glfw网站下载的mingw32的预编译二进制文件,还是必须将cygwin与cygwin一起使用?当我通过向环境系统变量路径中添加cygwin / bin来尝试与cygwin进行cmake时,它说“使用Win32进行窗口创建”,而cygwin / bin / make.exe和gnu窗口都使

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

如果我进入glfw源中的cmakelist.txt并强制其使用X11,它会说“使用X11进行窗口创建”,然后说X11 / extensions / xf86vmode.h丢失了,并且没有将其打包在cygwin的setup-x86.exe中。我可能会用cmake做一些非常错误的事情,但是我不知道。我能够使用mingw32作为环境系统变量路径中的本机编译器进行安装,制作和安装。

1 个答案:

答案 0 :(得分:1)

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

运行Xserver和X终端

enter image description here

它将在任务栏上显示两个图标,绿色的X 并运行Xterm。

enter image description here

要编译:
从下载源 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,因为bin目录是Cygwin上共享库的正确位置 之后,可以使用

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

并在Xterminal中运行

$ ./simple.exe

这是快照

colored triangle

要构建所有示例,请执行以下操作:

$ cd examples
$ cmake .
$ make

所有都建立在一个

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