Перехват функций Linux для OpenCL

Я новичок в C, так что будьте нежны.

Я хочу использовать метод перехвата библиотеки для Linux, чтобы заменить вызовы библиотеки OpenCL моей собственной библиотекой. Я так понимаю, что это можно сделать с помощью LD_PRELOAD. Поэтому я могу просто повторно реализовать функции OpenCL, как определено в заголовочном файле OpenCL, в моей собственной библиотеке, с которой затем можно связать.

Проблема в том, что этот заголовок OpenCL также содержит определения некоторых внешних структур, например.

typedef структура _cl_mem * cl_mem;

которые не определены в заголовке OpenCL. Возможно ли, что эти структуры определены в общей библиотеке OpenCL? Если нет, то где они могут быть определены?

Ваше здоровье

Крис


person Chris    schedule 16.07.2010    source источник
comment
приведенный вами пример не является внешним определением   -  person Anycorn    schedule 16.07.2010
comment
Извините, extern был опущен, но в заголовке OpenCL некоторые из этих определений типов объявлены и инкапсулированы с помощью extern{}.   -  person Chris    schedule 29.07.2010


Ответы (1)


Этот typedef объявляет тип, указывающий на структуру, содержимое которой не объявлено. Это означает, что код, использующий его, не может выполнять такие действия, как проверка его размера, копирование структуры или проверка ее содержимого — он просто не знает, какого она размера. Это традиционная техника в C для создания непрозрачного или закрытого типа. Вы можете объявить структуру внутри своей библиотеки OpenCL, а официальный заголовок не накладывает ограничений на содержание этой структуры. Он может быть даже пустым, если все, что вам нужно, это идентификатор, который вы можете сохранить в самом указателе, хотя это делается редко. Примером того же метода, используемого в стандартной библиотеке C, является тип FILE. Это может быть как простой целочисленный файловый дескриптор, так и сложная структура, содержащая полное состояние файловой системы; стандартный код C не будет знать. Подробности известны только библиотеке.

Короче говоря, вы можете объявить эту структуру как угодно, если вы реализуете каждую функцию, которая обрабатывает эту структуру. Программа, которая ссылается на вашу библиотеку, никогда не обрабатывает структуру, а только указывает на нее.

person Yann Vernier    schedule 19.07.2010
comment
Спасибо. Это в сочетании с вики-страницей о непрозрачных указателях значительно прояснило, что здесь происходит. - person Chris; 20.07.2010