2010-07-16 5 views
2

Я довольно новичок в C, поэтому будьте нежны.Перехват функции Linux для OpenCL

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

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

typedef struct _cl_mem * cl_mem;

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

Приветствие

Крис

+0

пример, который вы предоставили, не соответствует определению extern – Anycorn

+0

Извините, extern был опущен, но в заголовке OpenCL ряд этих typedefs объявлен и инкапсулирован с помощью extern {}. – Chris

ответ

3

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

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

+0

Спасибо. Это в сочетании со страницей wiki на непрозрачных указателях ясно объясняет, что здесь происходит. – Chris

Смежные вопросы