在Windows 8中链接OpenCL库(MinGW)

时间:2014-07-16 23:23:15

标签: c windows compiler-construction linker opencl

我已经搜索了高低的答案,所以我很抱歉,如果这是一件微不足道的事情,我无法自行解决。

我刚刚获得了具有双780i gpus的新Alienware极光,我将用于CT图像重建。我打算在OpenCL工作,因为这是我已经知道的。到目前为止,我只使用Mac并使用OpenCL框架编译代码非常简单。现在,在Windows 8.1中,事情就不那么重要了。

我已经安装了NVidia Cuda SDK,它附带了所有OpenCL头文件和库(都安装在标准位置),并开始尝试使用MinGW配置Code ::块来编译和链接OpenCL库。我总是得到同样的错误(向下滚动以查看它)。我之前已经链接了库,所以我99%我已经在那里正确配置了东西,但显然我错过了一些东西。要查看我做了什么,请转到http://www.obellianne.fr/alexandre/tutorials/OpenCL/tuto_opencl_codeblocks.php

我已经转移到命令行,这样我就可以更全面地配置,但即使我仔细配置,我也会遇到同样的错误。
我在DOS提示符下一直使用的调用如下:

gcc -v -Wall -std=c99 -I "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.0\include" -L "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.0\lib\x64" main.c -lOpenCL

我的输出是这样的:

C:\Users\john\AppData\Local\Temp\ccGTa4TT.o:main.c:(.text+0x5f): undefined reference to `clGetPlatformIDs@12'
C:\Users\john\AppData\Local\Temp\ccGTa4TT.o:main.c:(.text+0xb5): undefined reference to `clGetDeviceIDs@24'
C:\Users\john\AppData\Local\Temp\ccGTa4TT.o:main.c:(.text+0xf3): undefined reference to `clGetDeviceIDs@24'
C:\Users\john\AppData\Local\Temp\ccGTa4TT.o:main.c:(.text+0x141): undefined reference to `clGetDeviceInfo@20'
C:\Users\john\AppData\Local\Temp\ccGTa4TT.o:main.c:(.text+0x18f): undefined reference to `clGetDeviceInfo@20'
C:\Users\john\AppData\Local\Temp\ccGTa4TT.o:main.c:(.text+0x1bf): undefined reference to `clGetDeviceInfo@20'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: C:\Users\john\AppData\Local\Temp\ccGTa4TT.o: bad reloc address 0x20 in section `.eh_frame'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: final link failed: Invalid operation
collect2.exe: error: ld returned 1 exit status

(我已经剔除了一些东西,但如果需要可以更新更详细的信息)

奇怪的是,经过多次摆弄后,链接器正在链接库(嗯,不是,但至少找到了库并尝试链接它)。

我知道当-lOpenCL在错误的地方时会遇到这些问题,所以我尝试将它放在我能想到的任何地方都没有成功。它总是会抛出相同的错误。

我的程序的源代码可以在最底层找到。它是从书籍示例中剪切和粘贴的,我已经在我的mac上成功编译了它。

有什么想法吗?

谢谢, 约翰

#include <stdio.h>
#include <stdlib.h>
#include <CL/cl.h>
int main()
{
   /* Host/device data structures */
   cl_platform_id platform;
   cl_device_id dev;
   cl_uint addr_data;
   cl_int err;

   /* Extension data */
   char name_data[48], ext_data[4096];

   /* Identify a platform */
   err = clGetPlatformIDs(1, &platform, NULL);
   if(err < 0) {
      perror("Couldn't find any platforms");
      exit(1);
   }

   /* Access a device, preferably a GPU */
   /* Changed on 2/12 to fix the CL_INVALID_VALUE error */
   err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &dev, NULL);
   if(err == CL_DEVICE_NOT_FOUND) {
      err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_CPU, 1, &dev, NULL);
   }
   if(err < 0) {
      perror("Couldn't access any devices");
      exit(1);
   }

   /* Access device name */
   err = clGetDeviceInfo(dev, CL_DEVICE_NAME,
      48 * sizeof(char), name_data, NULL);
   if(err < 0) {
      perror("Couldn't read extension data");
      exit(1);
   }

   /* Access device address size */
   clGetDeviceInfo(dev, CL_DEVICE_ADDRESS_BITS,
      sizeof(addr_data), &addr_data, NULL);

   /* Access device extensions */
   clGetDeviceInfo(dev, CL_DEVICE_EXTENSIONS,
      4096 * sizeof(char), ext_data, NULL);

   printf("NAME: %s\nADDRESS_WIDTH: %u\nEXTENSIONS: %s\n",
      name_data, addr_data, ext_data);

return 0;

}

2 个答案:

答案 0 :(得分:1)

想出来。哪个好,因为我的神经衰弱了。

使用我安装的mingw版本(通过安装工具),我必须链接32位库。

GCC: Compiling an OpenCL host on Windows

答案 1 :(得分:0)

如果你需要更多内存,可以编译和编译x64的MinGW风格。对于像Qt这样的项目,可能是必要的。他们推荐了一些你可以在这里阅读的内容:

http://qt-project.org/wiki/MinGW-64-bit

我已使用ReubenVBQt中使用x64库编译OpenCL,但这大约是在1年前。