无法将 Windows 上的 OpenCL 与 GHC 链接



我试图让OpenCLRaw绑定到一个点,我可以在windows上使用它们。我已经在github上创建了OpenCLRaw的分支,这样我就可以根据需要进行修改。我的分支在这里:https://github.com/dagit/OpenCLRaw

我大部分时间都在我的"FunPtr"分支中工作。

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

我能够构建一个"微不足道的"C程序,并使用我从mingw(不是从Haskell安装)生成的。a文件和gcc链接它。我使用的是Haskell平台的最新windows版本。

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

我使用示例脚本中的命令(例如,gendef和dlltool)。我已经尝试使用32位尽可能多的一切,因为我知道,GHC将希望一切都是32位,所以我不认为这是一个32位vs. 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而不是call。

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

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

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

最新更新