在Mingw Nvidia SDK上编译OpenCL

使用Mingw和Nvidia SDK可以编译OpenCL吗?

我知道,它没有正式的支持,但没有任何意义。 不是作为静态链接库提供的库吗? 我的意思是一旦用任何可能的编译器进行编译,并成功链接,那么问题是什么?

我设法编译并成功地将我的代码链接到Nvidia SDK提供的OpenCL库,但是可执行程序在clGetPlatformIDs这是我的代码中第一个OpenCL调用)抛出Segmentation Fault。

这是我的编译命令

 x86_64-w64-mingw32-g++ -std=c++11 File.cpp \ -L"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\lib\x64" \ -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\include" \ -gcoff -lOpenCL -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 \ -lshell32 -lole32 -loleaut32 \ -luuid -lodbc32 -lodbccp32 -luser32 -lgdi32 -lmingwex -m64 \ -DWIN32 -D_DEBUG -D_CONSOLE 

请注意,这些库是从示例OpenCL代码的.sln文件中获取的。

我试过这些库的各种组合,似乎没有任何工作。

还有一种方法可以使用Mingw进行编译并使用别的链接进行链接? 我不确定别的可能是什么。

我们已经能够通过使用MinGW reimp和dlltool实用程序来为“OpenCL.dll”DLL创建一个导入库“libOpenCL.a”。 以下是我们所遵循的步骤:

  • 第1步:确保你已经安装了mingw-utils(对于reimp和dlltool)。 如果没有,请在MinGW提示符下键入:

    mingw-get安装mingw-utils

  • 第2步:接下来,键入以下命令:

    重新打开OpenCL.lib

这应该产生一个OpenCL.def和libOpenCL.a文件。 如果结果符合“无效或腐败的进口图书馆”的要求,则应采取替代措施2。

  • 备选步骤2:使用dlltool和.def文件,您可以在这里找到: http ://pastebin.com/f2ac38b2f。 该命令变成:

    dlltool -l libOpenCL.a -d OpenCL.def -A -k

您现在可以链接到新创建的libOpenCL.a。 如果您仍然看到丢失符号,请将它们添加到.def文件并重复dlltool命令。

我们能够得到这一切工作感谢以下帖子中的信息,以供参考:

  1. http://oscarbg.blogspot.com/2009/12/opencl-with-mingw.html
  2. http://www.mingw.org/wiki/CreateImportLibraries (我只能粘贴2个链接)

OpenCL库仅仅是OpenCL.dll的存根。 我建议使用动态加载技术。 它只会解决你所有的问题。 或者你真的需要一些OpenCL的nVIDIA调整?

它不仅在运行时更安全,而且由于不需要链接器也不需要定义,也不需要任何东西。 只是一个简单的cpp / hpp文件添加到您的专业。

一个很好的使用CLEW 。 但是我不完全同意那个库,因为C ++包装被破坏了。 所以,也许你会需要一些调整。 此外,我通常禁用“atexit”代码,因为它可能有问题。