在Cygwin下编译最小的GLEW应用程序

时间:2008-12-23 17:17:57

标签: opengl cygwin glew

让我们考虑以下程序并尝试在Cygwin下编译它:

#include <GL/glut.h>
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glLoadIdentity();
}

它编译并运行得很好。 -I/usr/include/opengl似乎非常重要。

g++ -I/usr/include/opengl -I../include/cygwin -L../lib/cygwin test.cpp -o test.exe -lglut32 -lglu32 -lglew32 -lopengl32

现在,

#include <GL/glew.h> // from newest NVIDIA SDK
#include <GL/glut.h>
int main(int argc, char** argv)
{
    glewInit();
    glutInit(&argc, argv);
    glLoadIdentity();
}

编译
g++ -I/usr/include/opengl -I../include/cygwin -L../lib/cygwin test.cpp -o test.exe -lglut32 -lglu32 -lglew32 -lopengl32

失败。 如何构建第二个应用程序?

第一

有几种方法可以通过NVIDIA SDK构建glew:by VS,cygwin,cygwin和-D_WIN32。我也从源头尝试了cygwin构建的原始glew。

VS build给出

/cygdrive/c/DOCUME~1/kelebron/LOCALS~1/Temp/ccErbecl.o:test.cpp:(.text+0xa8): undefined reference to `_glLoadIdentity'
collect2: ld returned 1 exit status

cygwin build提供了许多

../lib/cygwin/glew32.lib(glew.o):glew.c:(.text+0x38e): undefined reference to `_glXGetProcAddress'

和带有-D_WIN32的cygwin根本没有编译(我受到this post的轻微推动)。​​

第二

似乎有两种方法可以与OpenGL链接 用-L / lib / w32api
或者使用-L / usr / X11R6 / lib -lX11 -lXi -lXmu

但是,-L指令不会改变任何东西。我有/usr/lib/w32api/libopengl32.a,但可能缺少X11版本(/ usr / X11R6 / lib / libGL?)。我应该在Cygwin中包含哪些包?我已经安装了所有以libGL开头的(不仅仅是......)。

4 个答案:

答案 0 :(得分:6)

前一段时间我遇到过类似的问题,我发现有两种方法可以在Cygwin下编译opengl代码。
第一个链接反对原生win32api库glut32 glu32 opengl32(也是glui)。 那些年纪稍大:
 过剩v3.7.6
 opengl v1.1
 glui 2.11

第二种方式使用X11库glut glu gl。他们的头文件中有更新的版本号(请注意,使用GL扩展需要&gt; v1.2):
 过剩v4(freeglut)
 opengl v1.3
 glext
 ...

所以要使用第一个选项comile: -I / usr / include / opengl
并链接: -lglut32 -lGLU32 -lOpenGL32

要使用X11版本,请编译: -I / usr / include / (默认包含) 并链接: -lglut -lGLU -lGL (注意区别)
你可以添加X11标题和库,但我猜它们包含在GL标题中 的 -I的/ usr / X11R6 /包含
-L / usr / X11R6 / lib -lXmu -lXi -lXext -lX11


在Cygwin安装程序中,您可以选择以下软件包:
opengl - 给出opengl,glut,glui的win32版本 libglut-devel - X11版本的glut(freeglut),这也将挑选所有依赖包。 (glproto,libGL libGLU,libX11,...)
我还建议包括 Xorg-server ,因为你需要一台X服务器
希望这会有所帮助。

答案 1 :(得分:3)

为了确保我们谈论同样的问题,这是我过去得到的信息。

  

$ g ++ -o glew_test.exe glew_test.cpp -lglut32 -lglew32
  C:\用户\弗雷德里克\ Users \用户的Fredrik \ AppAppData \本地\温度/ ccgSNdfr.o:
  glew_test.cpp :(。text + 0x1c):未定义引用`__glutInitWithExit'
  C:\用户\弗雷德里克\应用程序数据\本地的\ Temp / ccgSNdfr.o:
  glew_test.cpp :(。text + 0x37):未定义引用`__glutCreateWindowWithExit'
  C:\用户\弗雷德里克\应用程序数据\本地的\ Temp / ccgSNdfr.o:
  glew_test.cpp :(。text + 0x53):未定义引用`__glutCreateMenuWithExit'
  C:\用户\弗雷德里克\应用程序数据\本地的\ Temp / ccgSNdfr.o:
  glew_test.cpp :(。text + 0x9e):未定义的引用`glutInitDisplayMode'
  C:\用户\弗雷德里克\应用程序数据\本地的\ Temp / ccgSNdfr.o:
  glew_test.cpp :(。text + 0xb2):未定义的引用`glutInitWindowPosition'
  C:\用户\弗雷德里克\应用程序数据\本地的\ Temp / ccgSNdfr.o:
  glew_test.cpp :(。text + 0xc6):未定义的引用`glutInitWindowSize'
  collect2:ld返回1退出状态

以下几页帮助我解决了这个问题。  

基本上我必须在文件的开头定义_STDCALL_SUPPORTED和_M_IX86,并在glew.h之前包含windows.h

然后我使用了标志-lglut32 -lglew32

如果你想尝试一下,这里也是源头:

#define _STDCALL_SUPPORTED
#define _M_IX86
#include <windows.h>
#include <GL/glew.h>
#include <GL/glut.h>
#include <cstdio>

int main(int argc, char **argv) {
    glutInit(&argc, argv);
    glutCreateWindow("MM 2004-05");
    glewInit();
    if (glewIsSupported("GL_VERSION_2_0"))
        printf("Ready for OpenGL 2.0\n");
    else {
        printf("OpenGL 2.0 not supported\n");
    }
    return 0;
}

请注意,OpenGL2.0测试需要窗口。

答案 2 :(得分:1)

听起来您想要链接本机Win32库而不是X11。添加 -L / lib / w32api 。否则,您需要链接X11库( -L / usr / X11R6 / lib -lX11 -lXi -lXmu )以消除glX *链接器错误。

答案 3 :(得分:0)

以前的建议是否对您有用?

我不清楚您是否在链接或编译GLEW时遇到问题。我通过包含源使用GLEW并在过去使用过链接。

如果你想编译GLEW,那么请确保你选择正确的zip,因为使用基于* nix的代码的脚本可能无法在windows下正确运行(不确定Cygwin)。

GLEW应首先在标题和链接顺序中。