6

让我们考虑以下程序并尝试在 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 的方法有多种:VS、cygwin、cygwin 和 -D_WIN32。我还尝试了来自源代码的原始 glew 的 cygwin 构建。

VS构建给出

/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 构建提供了许多

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

并且带有 -D_WIN32 的 cygwin 根本无法编译(这篇文章让我有点激动)。

第二

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

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

4

4 回答 4

6

前阵子也遇到过类似的问题,发现在Cygwin下编译opengl代码有两种方式。
第一个与本机 win32api 库 glut32 glu32 opengl32 (也是 glui)的链接。那些有点旧:
glut v3.7.6
opengl v1.1 glui
2.11

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

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

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


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

希望这可以帮助。

于 2009-06-08T01:38:15.347 回答
3

只是为了确保我们谈论的是相同的问题,这是我以前得到的信息。

$ g++ -o glew_test.exe glew_test.cpp -lglut32 -lglew32
c:\Users\Fredrik\Users\Fredrik\AppAppData\Local\Temp/ccgSNdfr.o:
glew_test.cpp:(.text+0x1c): undefined reference to ` __glutInitWithExit'
c:\Users\Fredrik\AppData\Local\Temp/ccgSNdfr.o:
glew_test.cpp:(.text+0x37): undefined reference to `__glutCreateWindowWithExit'
c:\Users\Fredrik\AppData\Local\Temp/ccgSNdfr .o:
glew_test.cpp:(.text+0x53): undefined reference to `__glutCreateMenuWithExit'
c:\Users\Fredrik\AppData\Local\Temp/ccgSNdfr.o:
glew_test.cpp:(.text+0x9e): undefined reference到 `glutInitDisplayMode'
c:\Users\Fredrik\AppData\Local\Temp/ccgSNdfr.o:
glew_test.cpp:(.text+0xb2): undefined reference to `glutInitWindowPosition'
c:\Users\Fredrik\AppData\Local\Temp/ccgSNdfr.o:
glew_test.cpp:(.text+0xc6): undefined reference to `glutInitWindowSize'
collect2: ld 返回 1 exit status

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

基本上我必须在文件开头定义 _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 测试需要该窗口。

于 2009-11-21T03:33:57.473 回答
1

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

于 2008-12-23T20:13:48.060 回答
0

以前的建议对您有用吗?

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

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

GLEW 应该在标题和链接顺序中排在第一位。

于 2009-11-03T22:11:30.633 回答