windows - 无法将 Windows 上的 OpenCL 与 GHC 链接起来

标签 windows haskell linker opencl

我正在努力使 OpenCLRaw 绑定(bind)达到可以在 Windows 上使用它们的程度。我已经在 github 上 fork 了 OpenCLRaw 存储库,因此我可以根据需要进行修改。我的分支在这里: https://github.com/dagit/OpenCLRaw

我大部分时间都在我的“FunPtr”分支上工作。

我遇到的问题是:我安装了 AMD 的 OpenCL SDK,将其特定于 Visual Studio 的 .lib 文件转换为 gcc 可以处理的文件(.a 文件),但 ghc 似乎无法与其链接。我在 OpenCL API 中使用的所有内容都得到 undefined symbol 。

我能够构建一个“简单的”C 程序并使用我生成的 .a 文件和来自 mingw(不是来自 Haskell 安装)的 gcc 链接它。我使用的是 Haskell 平台的最新 Windows 版本。

这些是我用来生成 .a 文件的步骤: http://forums.amd.com/forum/messageview.cfm?catid=390&threadid=138890

我使用了示例脚本中的命令(例如 gendef 和 dlltool)。我已尝试尽可能多地使用 32 位的所有内容,因为我知道 GHC 希望所有内容都是 32 位的,所以我认为这不是 32 位与 64 位的问题。

有谁知道在 ghc 下调用 gcc 而不是我从 mingw 获得的 gcc 是否有什么不同?

我也玩过 ghc 命令行(我使用 cabal-dev --verbose=3 检查命令行),但我仍然无法将其按摩到工作状态。

如有任何帮助,我们将不胜感激!

最佳答案

OpenCL 使用 stdcall约定,但 OpenCLRaw 使用 ccall。这会产生几个问题。主要是链接器希望函数名称符号以 @NN 结尾,其中 NN 取决于函数。

事实证明,生成 libOpenCL.a 的正确方法如下(来自 mingw shell):

cp /c/Windows/System32/OpenCL.dll .
gendef OpenCL.dll
dlltool -l libOpenCL.a -d OpenCL.def -k -A

这将生成 libOpenCL.a,ghc 可以正确地用于链接,但前提是 OpenCLRaw 被修改为使用 stdcall 而不是 ccall。

现在我明白了这个问题,我可以修复 OpenCLRaw 绑定(bind)以在 Windows 上做正确的事情。

当我使用 pexports 而不是 gendef 时,我能够从符号名称中删除 @NN,但随后生成的程序开始出现段错误。这是因为找到了符号但调用约定不正确,可能导致堆栈损坏。

给我的主要教训是您的 FFI 绑定(bind)必须与您的 C 库的调用约定相匹配。

关于windows - 无法将 Windows 上的 OpenCL 与 GHC 链接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7391634/

相关文章:

windows - Url 重写不会安装在 Windows 10 IIS 10 上

Haskell 太多 where 子句,任何替代建议

c++ - OpenCV 2.4.3 到 2.4.9 版本变更

c++ - 为什么在使用模板时出现 "unresolved external symbol"错误?

c++ - Visual Studio 警告 C4743 : How does Whole Program Optimization affect _fltused?

windows - 如何让 emacs 正确打印 pdf?

python - 如何在Windows docker容器中安装python和ansible

c++ - 使用 Intel Vtune 从 Qt Creator 分析应用程序

Haskell 函数不兼容的类型和定义

haskell - xmonad: float 窗口的默认大小