2010-07-16 52 views
2

我对C很新,所以要温和。OpenCL的Linux函数截取

我想使用Linux的库拦截方法来用我自己的库替换对OpenCL库的调用。我明白这可以使用LD_PRELOAD完成。所以我可以重新实现在我自己的库中的OpenCL头文件中定义的OpenCL函数,然后可以链接它。

问题是,这个OpenCL头还包含一些外部结构定义,例如,

typedef struct _cl_mem * cl_mem;

哪些未在OpenCL标头中定义。这些结构是否可以在OpenCL共享库中定义?如果不是,他们可以在哪里定义?

干杯

克里斯

+0

您提供的示例不是外部定义 – Anycorn 2010-07-16 16:11:58

+0

对不起,extern被省略,但在OpenCL标头中,许多这些类型定义是用extern {}声明和封装的。 – Chris 2010-07-29 12:41:30

回答

3

那的typedef声明一个类型指向一个结构,它的内容是不宣。这意味着使用它的代码不能执行诸如检查其大小,复制结构或检查其内容 - 它根本不知道它的大小。 这是C中创建不透明或私有类型的传统技术。您可以在OpenCL库中声明结构,官方头文件对该结构包含的内容没有限制。它甚至可能是空的,如果你需要的只是一个你可以存储在指针本身的ID,尽管这很少完成。 标准C库中使用的相同技术的一个示例是FILE类型。它可能像整型文件描述符一样简单,或者像包含整个文件系统状态的结构一样复杂;标准的C代码将不知道。这些资料只为图书馆所知。

总之,只要你实现了函数来处理该结构,你可以声明那个结构。链接到您的库的程序从不处理结构,只有指向它的指针。

+0

谢谢。这与关于不透明指针的维基页面结合在一起已经很好地澄清了这里发生的事情。 – Chris 2010-07-20 17:18:24