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

时间:2011-11-09 02:23:10

标签: c++ c macos eclipse-cdt opencl

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

#include <OpenCL/cl.h>

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

我的问题:

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

对于这种困惑感到抱歉,感谢任何帮助!

注意:从khronos网站上的this article开始,OpenCL目录似乎应该存在。

2 个答案:

答案 0 :(得分:8)

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

然而,基本的故事是​​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 <stdio.h>
#include <stdlib.h>
#include <OpenCL/opencl.h>

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;它仍然可以正常工作。

答案 1 :(得分:2)

根据Khronos规范link to K,有一个单独的文件充当C ++的包装器,文件末尾的“.h”意味着这个头可能仅用于C和“也许“对于C ++。也许你可以解决这个阅读页面。

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

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

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

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

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