我在使用ghc版本7.0.3.20110330的Ubuntu 11.10上运行nvidia显示驱动程序的“当前版本更新”。您可以通过运行来重现:
curl http://ix.io/1t6 > Stroke.hs; ghc --make Stroke.hs; ./Stroke
...
Stroke: user error (unknown GLU entry gluOrtho2D)
但我可以运行opengl并且运行正常。我尝试了glxgears,它运行良好,我运行了一个opengl基准测试,它也运行良好。
haskell opengl libs的版本 跑步的结果:
for p in OpenGL OpenGLRaw GLURaw; do ghc-pkg latest $p; done
OpenGL-2.4.0.1
OpenGLRaw-1.1.0.1
GLURaw-1.1.0.0
答案 0 :(得分:2)
这是一个明确的错误。链接器存在问题(我不确定这是否特定于11.10或GHC 7.0+)。以下是对我的解释:链接器基本上决定,因为你没有静态链接到libglut,它只是通过不将你的可执行文件链接到它来优化。您可以通过将以下补丁应用于GLURaw 1.1.0.0来解决此问题:
diff -ur GLURaw-1.1.0.0.orig/cbits/HsGLURaw.c GLURaw-1.1.0.0/cbits/HsGLURaw.c
--- GLURaw-1.1.0.0.orig/cbits/HsGLURaw.c 2011-05-12 09:02:30.000000000 +1200
+++ GLURaw-1.1.0.0/cbits/HsGLURaw.c 2011-05-11 23:08:10.000000000 +1200
@@ -68,6 +68,9 @@
#include <stdlib.h>
#include <dlfcn.h>
+#include <stdio.h>
+#include <GL/glu.h>
+
void*
hs_GLU_getProcAddress(const char *name)
@@ -80,6 +83,7 @@
/* Get a handle for our executable. */
handle = dlopen(NULL, RTLD_LAZY);
}
+ printf("%p\n", gluBeginCurve);
return handle ? dlsym(handle, name) : NULL;
}
Only in GLURaw-1.1.0.0: dist
应用此补丁后在GLURaw上运行cabal install
,它应该摆脱这个问题。
答案 1 :(得分:1)
我知道将编译步骤改为:
ghc --make Stroke.hs -lGL -lGLU -lglut
我有版本(我没有安装OpenGLRaw,GLURaw):
cabal list *
* OpenGL
Default available version: 2.4.0.1
Installed versions: 2.2.3.0
* OpenGLRaw
Default available version: 1.1.0.1
Installed versions: [ Not installed ]
* GLURaw
Default available version: 1.1.0.0
Installed versions: [ Not installed ]
编辑:我正在使用 Ubuntu 11.04 和 GHC 7.0.3 与 Haskell Platform 2011.2.0.1
答案 2 :(得分:0)
我在我的系统上编译了它(Mac OS 10.7.2和GHC 7.2.1),它在这里工作,所以程序应该是正确的。我的包版本是
GLURaw-1.1.0.0
GLUT-2.2.2.0
OpenGL-2.4.0.1
OpenGLRaw-1.1.0.1
也许您可以尝试找一个使用gluOrtho2D
的简单C / C ++示例,看看是否有效?
答案 3 :(得分:0)
从OpenGL 3.0开始,GLU的使用似乎已被大量弃用,自从Haskell的OpenGL-2.4软件包以来,已经使用了更多的版本。 OpenGL wiki上有一个提到:
GLU - OpenGL实用程序库是一个额外的库 包含一些用于其他任务的函数。它是 传统的,可以在很多教程和例子中找到。但 GLU使用了许多现已弃用的OpenGL功能。该 内部投影矩阵不应再使用,所以 程序员应该使用gluPerspective的替代品来代替 更新内部投影矩阵将返回此矩阵。
这表明不再使用Graphics.Rendering.OpenGL.GLU.Matrix
中的函数。这包括:
ortho2D
perspective
lookAt
pickMatrix
project
unProject
unProject4
我怀疑这可能是您的代码编译的原因,但在使用ortho2D
时失败。
使用glOrtho
代替gluOrtho2D
可能很诱人,因为我们有:
ortho2D left right bottom up = ortho left right bottom up (-1) 1
然而,根据OpenGL spec,从OpenGL 3.1开始,即使glOrtho
也被弃用了。在撰写本文时,使用ortho
代替ortho2D
使用此等效项。
我注意到一位评论者也遇到了perspective
功能的麻烦。这是在不使用GLU的情况下自己实现它的一种方法(但仍使用OpenGL 3.1中不推荐使用的函数):
import qualified Graphics.Rendering.OpenGL as GL
perspective :: GL.GLdouble -> GL.GLdouble -> GL.GLdouble -> GL.GLdouble -> IO ()
perspective fovy aspect near far =
GL.frustum xmin xmax ymin ymax near far
where ymax = near * tan (fovy * pi / 360.0)
ymin = - ymax
xmax = ymax * aspect
xmin = ymin * aspect