繁体   English   中英

无法将Windows上的OpenCL与GHC链接

[英]Can't link OpenCL on Windows with GHC

我正在尝试将OpenCLRaw绑定到我可以在Windows上使用它们的点。 我已经在github上分叉了OpenCLRaw repo,所以我可以根据需要进行修改。 我的分支在这里: 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检查命令行),我仍然无法按摩它进入工作状态。

任何帮助,将不胜感激!

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库的调用约定相匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM