如何让 GHCi 加载 Opengl 包?

Posted

技术标签:

【中文标题】如何让 GHCi 加载 Opengl 包?【英文标题】:How do i get GHCi to load Opengl packages? 【发布时间】:2017-12-12 19:17:33 【问题描述】:

我可以使用 GHC 成功构建链接到 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'

【问题讨论】:

【参考方案1】:

我已经有一段时间没有涉足该级别的 Haskell 开发了。但它看起来与标准链接问题非常相似。

我可以回答你为什么会发生这种情况,但目前我不知道如何解决它,而不是解决上游的问题。

函数wglGetProcAddress 位于opengl32.dll。所以你的 HSOpenGLRaw 似乎没有正确链接到那个,因此无法找到符号。

如果这发生在 *nix 环境中,一个简单的解决方案是 LD_PRELOAD libGL.so。但是,在 Windows 上,将模块加载到进程中不会使其符号自动对进程的其余部分可见,因此在那里不起作用。

这也解释了为什么它适用于独立二进制文件。这些链接在运行时之外。因此,可以将额外的库传递给链接器,这将解决缺少的依赖关系。

【讨论】:

以上是关于如何让 GHCi 加载 Opengl 包?的主要内容,如果未能解决你的问题,请参考以下文章

Haskell、GHC、win32、开罗

如何获得光泽以不关闭 ghci?

GHCi“让”——它有啥作用?

在沙箱中安装了 parsec,但在 ghci 中尝试加载文件时找不到库

使 GHCi 以十进制形式打印。

Windows 10 上的 ghci 错误:无法加载用户指定的 .o/.so/.DLL (addDLL: pthread