2013-05-09 50 views
0

我正在嘗試從C++類調用內核包裝foo。我一直試圖做的建議here如下:從C++類調用.cu文件中的內聯函數

// In CPP.h: 
class cls { 
    extern "C" inline void foo(); 
} 

// In Kernels.cu: 
#include "CPP.h" 
extern "C" inline void cls::foo() { 
    // call kernels here 
} 

但這並沒有工作 - 我得到一個編譯器錯誤:

  • CPP.h: invalid storage class for a class member
  • CPP.h: "cls::foo" was referenced but not defined
  • Kernels.cu: label "cls" was declared but never referenced

怎麼回事?

+1

這很簡單,類內部的代碼必須具有C++鏈接。 – talonmies 2013-05-09 14:52:09

+0

@talonmies - 所以成員'cls :: foo'應該只在C++文件中定義,它應該調用一個C++非成員標記'extern C',然後調用'.cu中的CUDA內核包裝器'文件,然後調用內核? – mchen 2013-05-09 14:58:23

回答

2

你不應該用extern "C"來標記類方法。

使用extern "C"說明符創建包含非成員函數,並讓此函數調用您的類的方法(您還需要指定一個實例)。

+0

使封裝器調用類方法?確定它應該是另一種方式 - 我希望我的C++類方法調用CUDA-C內核包裝器,以便cls :: foo()將在GPU上執行。謝謝。 – mchen 2013-05-09 15:03:57

+0

然後它應該會更容易:使用'extern「C''實現包裝函數作爲非成員,並像任何其他函數一樣從任何類方法調用它(不必使此函數成爲類成員)。 – Inspired 2013-05-09 15:19:22