2010-11-04 113 views
4

我試圖調用從C++文件中的CUDA(主機)功能,單獨編譯:調用CUDA代碼++代碼 - 整理出的extern 「C」

sample.cpp C++文件:

extern "C" void cuda_function(int a, int b); 
int main(){ 
    //statements 
    cuda_function(23, 34); 
    //statements 
} 

cuda.cu文件:

#include <cuda.h> 
__global__ void kernel(int a, int b) 
{ 
    //statements 
} 
void cuda_function(int a, int b){ 
    //cuda_function 
} 

構建命令:

g++ -c sample.cpp 
nvcc -c cuda.cu 
nvcc -o sample sample.o cuda.o 

但這給出了鏈接錯誤:

sample.o: In function `main': 
sample.cpp:(.text+0x163): undefined reference to `cuda_function' 
collect2: ld returned 1 exit status 

什麼是錯的C++和CUDA一體化的這種方法嗎?

+0

只是失去了'外部「C」'。 – 2010-11-04 18:44:32

回答

10

您已聲明cuda_function()extern "C",但隨後使用C++進行了定義。刪除extern "C"從您的排序,它會工作。

或者,也可以毫無意義地將相同的聲明添加到cuda.cu文件中。

稍微詳細一點,nvcc是一個包裝文件,它將文件拆分成主機代碼和設備代碼,然後分別調用主機編譯器和設備編譯器。回到過去的CUDA編程時代,nvcc以「C」模式調用主編譯器,這意味着當從C++調用時,需要將extern "C"放在這些工具上。回到目前,nvcc默認爲C++代表主機代碼,這意味着您不應再需要這些外部代碼(除非您的主機代碼的其餘部分是C代碼)。