我如何让 GHCi 加载 Opengl 包?
How do i get GHCi to load Opengl packages?
我可以使用 GHC 成功构建 link 针对 OpenGL 的可执行文件,但是我无法将包加载到 GHCi 中。这对我来说绝对是一个回归,因为它适用于 32 位 GHC(至少是我升级的版本)。我认为 GHC 版本不重要,重要的是我使用的是 64 位 GHC 系统。
在维护者的推荐下,我成功地将正确的 64 位版本的 opengl32 引入了 GHCi。这似乎是一个更高的问题。
这是相关的输出。不幸的是,详细的输出同样具体。函数 wglGetProcAddress 用于查找 opengl api 挂钩在 dll 中的位置。
$ ghcii.sh -package OpenGL
GHCi, version 7.6.1: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package OpenGLRaw-1.2.0.0 ... linking ... ghc.exe: unable to load
package `OpenGLRaw-1.2.0.0'
ghc.exe: C:\...\cabal\OpenGLRaw-1.2.0.0\ghc-7.6.1\HSOpenGLRaw-1.2.0.0.o:
unknown symbol `__imp_wglGetProcAddress'
我已经有一段时间没有涉足 Haskell 开发的水平了。但它看起来与标准链接问题非常相似。
我可以给你一个答案,告诉你为什么会发生,但目前我不知道如何解决它,除非在上游解决问题。
函数 wglGetProcAddress
在 opengl32.dll
中找到。所以你的 HSOpenGLRaw
似乎没有正确地链接到那个,因此找不到符号。
如果这发生在 *nix 环境中,一个简单的解决方案是 LD_PRELOAD libGL.so
。然而,在 Windows 上,将模块加载到进程中不会使其符号自动对进程的其余部分可见,因此在那里不起作用。
这也解释了为什么它适用于独立的二进制文件。这些链接在运行时之外。因此,可以将额外的库传递给链接器,链接器将解决缺少的依赖项。
我可以使用 GHC 成功构建 link 针对 OpenGL 的可执行文件,但是我无法将包加载到 GHCi 中。这对我来说绝对是一个回归,因为它适用于 32 位 GHC(至少是我升级的版本)。我认为 GHC 版本不重要,重要的是我使用的是 64 位 GHC 系统。
在维护者的推荐下,我成功地将正确的 64 位版本的 opengl32 引入了 GHCi。这似乎是一个更高的问题。
这是相关的输出。不幸的是,详细的输出同样具体。函数 wglGetProcAddress 用于查找 opengl api 挂钩在 dll 中的位置。
$ ghcii.sh -package OpenGL
GHCi, version 7.6.1: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package OpenGLRaw-1.2.0.0 ... linking ... ghc.exe: unable to load
package `OpenGLRaw-1.2.0.0'
ghc.exe: C:\...\cabal\OpenGLRaw-1.2.0.0\ghc-7.6.1\HSOpenGLRaw-1.2.0.0.o:
unknown symbol `__imp_wglGetProcAddress'
我已经有一段时间没有涉足 Haskell 开发的水平了。但它看起来与标准链接问题非常相似。
我可以给你一个答案,告诉你为什么会发生,但目前我不知道如何解决它,除非在上游解决问题。
函数 wglGetProcAddress
在 opengl32.dll
中找到。所以你的 HSOpenGLRaw
似乎没有正确地链接到那个,因此找不到符号。
如果这发生在 *nix 环境中,一个简单的解决方案是 LD_PRELOAD libGL.so
。然而,在 Windows 上,将模块加载到进程中不会使其符号自动对进程的其余部分可见,因此在那里不起作用。
这也解释了为什么它适用于独立的二进制文件。这些链接在运行时之外。因此,可以将额外的库传递给链接器,链接器将解决缺少的依赖项。