OpenCL头包含C ++中的相对路径问题

我试图在Eclipse CTD上运行OpenCL C ++示例(在Mac上)包含OpenCL头,如下所示:

#include  

该文件存在于我的系统上(OpenCL sdk默认安装在Mac上)但不在OpenCL目录中(实际路径: /System/Library/Frameworks/OpenCL.framework/Versions/A/Headers ),所以如果我添加该路径作为项目属性中的包含目录并从#include语句中删除相关OpenCL目录,链接显然已解决, 我注意到在该cl.h文件中,其他头文件使用相同的相对路径引用(例如OpenCL/cl_platform.h )但你可以从上面的路径看到这个OpenCL目录实际上并不存在,所以我想知道这个东西应该如何起作用。

我的问题:

在我上面的例子中,相对路径中的’OpenCL’目录是否应该存在于物理上的某个地方,或者它应该是某种环境变量或类似的,指向安装sdk的实际路径

对不起,混乱,任何帮助表示赞赏!

注意:从khronos网站上的这篇文章来看,似乎OpenCL目录应该是物理存在的。

我建议你阅读Apple的Frameworks文档。

然而,基本的故事是​​OS X根据您编译的框架解析库和头搜索路径。 例如,要在Macintosh上使用OpenCL SDK编译程序,您可以像这样编译:

 clang -framework OpenCL main.c 

这告诉clang(或gcc,或llvm-gcc,取决于您选择的编译器)在System OpenCL SDK中搜索标题(用于编译)和库(用于链接)。 试试看:

 // compile me with: clang -framework OpenCL -o test test.c #include  #include  #include  int main(int argc, char* const argv[]) { cl_uint num_devices, i; clGetDeviceIDs(NULL, CL_DEVICE_TYPE_ALL, 0, NULL, &num_devices); cl_device_id* devices = calloc(sizeof(cl_device_id), num_devices); clGetDeviceIDs(NULL, CL_DEVICE_TYPE_ALL, num_devices, devices, NULL); char buf[128]; for (i = 0; i < num_devices; i++) { clGetDeviceInfo(devices[i], CL_DEVICE_NAME, 128, buf, NULL); fprintf(stdout, "Device %s supports ", buf); clGetDeviceInfo(devices[i], CL_DEVICE_VERSION, 128, buf, NULL); fprintf(stdout, "%s\n", buf); } free(devices); } 

请注意,我在这里包含了OpenCL/opencl.h 。 这是包含在Mac上访问CL的首选标头。 如果查看标题,您将看到它包含cl.h以及cl_platform.h 。 如果您愿意,可以包含OpenCL/cl.h ; 它仍然可以正常工作。

根据Khronos规范链接到K,有一个单独的文件作为C ++的包装器,文件末尾的“.h”表示可能这个头只用于C和C ++的“可能” 。 可能你可以解决这个阅读页面。

无论如何,我发现Eclipse CDT真的很麻烦,也许值得尝试从命令行编译,因为MAC OS环境真的缺乏一个好的IDE,一般来说它对开发人员来说不是一个好的操作系统。

请记住,MAC的唯一“本机”语言是Objective-C,所有其他语言(如果存在)都在移植; 如果你计划开发一些重要的项目,我建议考虑转换到Windows或Linux,因为即使Linux为开发人员提供了比MAC OSX更好的环境。

编辑1:这是我发现的一个例子,它使用了我刚刚链接到链接2示例的Khronos页面中描述的绑定

编辑2:您可以尝试两件事 – 重新安装通常包含适合您的机器的OpenCL SDK的VGA驱动程序(英特尔还提供SDK,但它仅在iCore CPU和某些C2D上运行) – 从命令行进行编译

但是在这一点上你最好的伙伴可能是Xcode和MAC 链接下的OpenCL在线文档(请注意MAC默认包含OpenCL库的1.0版本),因为Xcode为MAC下的这类项目提供了更好的支持。可以使用这个IDE在互联网上找到很多教程。