c++中包含相对路径的OpenCL头文件问题

OpenCL header inclusion with relative path issue in C++

本文关键字:OpenCL 文件 问题 路径 包含 相对 c++      更新时间:2023-10-16

我正在尝试在Eclipse CTD上运行一个OpenCL c++示例,(在Mac上)包含如下OpenCL头文件:

#include <OpenCL/cl.h>

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

我的问题:

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

很抱歉造成混乱,感谢任何帮助!

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

我建议你阅读苹果关于框架的文档。

基本的故事,然而,是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, "%sn", buf);
    }
    free(devices);
}

注意,我在这里包括了OpenCL/opencl.h。这是在Mac上访问CL的首选头文件。如果您查看头文件,您将看到它为您包括cl.hcl_platform.h。如果你愿意,你可以只包括OpenCL/cl.h;

根据Khronos规范链接到K,有一个单独的文件作为c++的包装器,文件末尾的".h"也意味着这个头文件可能只适用于C,而"maybe"适用于c++。也许你读那一页就能解决这个问题。

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

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

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

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

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