2

我对C相当陌生,所以要温柔。

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

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

typedef 结构 _cl_mem * cl_mem;

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

干杯

克里斯

4

1 回答 1

3

该 typedef 声明了一个指向结构的类型,其内容未声明。这意味着使用它的代码不能做诸如检查其大小、复制结构或检查其内容之类的事情——它根本不知道它的大小。这是 C 中创建不透明或私有类型的传统技术。您可以在 OpenCL 库中声明该结构,并且官方标头对该结构包含的内容没有任何限制。它甚至可以是空的,如果您只需要一个可以存储在指针本身中的 ID,尽管很少这样做。标准 C 库中使用的相同技术的一个示例是 FILE 类型。它可能像整数文件描述符一样简单,也可能像包含整个文件系统状态的结构一样复杂;标准的 C 代码不会知道。这些细节只有图书馆知道。

简而言之,您可以随意声明该结构 - 只要您实现处理该结构的每个函数。链接到您的库的程序从不处理该结构,只处理指向它的指针。

于 2010-07-19T02:12:09.323 回答