2013-03-03 77 views
12

使用Mingw和Nvidia SDK编译OpenCL是否可能?在Mingw Nvidia SDK上编译OpenCL

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

我设法编译并成功地将我的代码链接到随Nvidia SDK提供的OpenCL库,但是可执行文件在clGetPlatformIDs处引发Segmentation Fault,这是我的代码中的第一个OpenCL调用。

这里是我的编译命令

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编译并使用别的链接进行链接?我不确定别的可能是什么。

+0

为什么不使用VC++ Express来构建主机代码?你也使用32位或64位库吗?有混淆的CUDA \ v5.0 \ lib \ x64和-luse32 -lcomdlg32 -ladvai32 ... -m64这些库都是必需的吗?简化您的命令行。 – 2013-03-03 17:51:12

+1

64位,我的C++代码使用C++ 11功能,所以VC++是不行的。我尝试删除和添加库,死胡同。 – omarzouk 2013-03-03 18:17:07

回答

12

我们已经可以通过使用MinGW reimp和dlltool实用程序为“OpenCL.dll”DLL创建一个导入库“libOpenCL.a”来完成此操作。这里是我们遵循的步骤:

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

    的MinGW得到安装的MinGW-utils的

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

    reimp 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个链接)
+0

确认这可以让您至少与GPU Computing SDK 5.5链接。 – imallett 2014-02-28 01:07:12

2

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

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

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

+0

提示看起来死了? – rogerdpack 2015-03-23 21:55:32