2010-07-16 49 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