【问题标题】:Can't link OpenCL on Windows with GHC无法将 Windows 上的 OpenCL 与 GHC 链接
【发布时间】:2011-11-15 12:55:41
【问题描述】:

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

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

我遇到的问题是:我安装了 AMD 的 OpenCL SDK,将他们的 Visual Studio 特定 .lib 文件转换为 gcc 可以处理的文件(.a 文件),但 ghc 似乎无法与之链接。我在 OpenCL API 中使用的所有东西都得到了未定义的符号。

我能够构建一个“简单的”C 程序并使用我生成的 .a 文件和来自 mingw 的 gcc(不是来自 Haskell 安装)链接它。我正在使用 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 来检查命令行),但我仍然无法将其按摩到工作状态。

任何帮助将不胜感激!

【问题讨论】:

  • 如果我使用 pexports 而不是 gendef 那么它会删除函数名称后的所有 @s。这允许 GHC 使用库文件进行链接,但现在 a)gcc 无法与该文件链接,b)我的小程序在调用 clGetPlatfromIDs 时出现段错误。
  • 我没有在 Windows 上测试它,但是我注意到 OpenCLRaw 有几个类型的错误,我为自己疯狂的 opencl 绑定,github.com/zhensydow/opencl
  • @Zhen,你有计划将你的绑定放在 Hackage 上吗?我寻找haskell 东西的第一个地方是hackage,然后是google 搜索。您的图书馆看起来像是对 Jeff 的改进。可惜它没有出现在 hackage 和 google 上。
  • 我打算加入hackage,但我想多测试一下
  • 我刚刚将它添加到hackage,hackage.haskell.org/package/OpenCL,它不够稳定,但也许我可以得到反馈来增强它。

标签: windows haskell linker opencl


【解决方案1】:

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

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

现在我了解了问题所在,我可以修复 OpenCLRaw 绑定以在 Windows 上做正确的事情。

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

对我来说主要的教训是你的 FFI 绑定必须匹配你的 C 库的调用约定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2021-02-13
    • 2021-09-16
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多