2012-11-08 102 views
1

我已經寫了有main.cpp包括Common.h文件未定義參考

#include "Common.h" 
int main(int argc , char **argv) 
{ 
    ... 
    DeviceFunc(a_h , numvar , b_h); //Showing the data 
    .... 
} 

然後,CUDA應用CUDA實現的功能,Common.h包含:

#ifndef __Common_H 
#define __Common_H 
#endif 
void DeviceFunc(float * , int , float *); 

此外,DeviceFunc.cu是相同的文件夾:

#include<cuda.h> 
#include<stdio.h> 
#include "Common.h" 
__device__ __global__ void Kernel(float *, float * ,int); 
void DeviceFunc(float *temp_h , int numvar , float *temp1_h) 
{ 
    float *a_d , *b_d; 
    //Memory allocation on the device 
    cudaMalloc(&a_d,sizeof(float)*(numvar)*(numvar+1)); 
    cudaMalloc(&b_d,sizeof(float)*(numvar)*(numvar+1)); 

    //Copying data to device from host 
    cudaMemcpy(a_d, temp_h, sizeof(float)*numvar*(numvar+1),cudaMemcpyHostToDevice); 

    //Defining size of Thread Block 
    dim3 dimBlock(numvar+1,numvar,1); 
    dim3 dimGrid(1,1,1); 

    //Kernel call 
    Kernel<<<dimGrid , dimBlock>>>(a_d , b_d , numvar); 

    //Coping data to host from device 
    cudaMemcpy(temp1_h,b_d,sizeof(float)*numvar*(numvar+1),cudaMemcpyDeviceToHost); 

    //Deallocating memory on the device 
    cudaFree(a_d); 
    cudaFree(b_d); 
} 

} 

現在,當我與nvcc -o main main.cpp編譯代碼,我得到這個錯誤main.cpp:(.text+0x3a0): undefined reference to 'DeviceFunc(float*, int, float*)'

什麼是

+1

您需要將DeviceFunc.cu構建到對象中並將其鏈接到主應用程序中。 –

+0

您使用的是CUDA 5嗎? –

+0

如果將cuda安裝在/ usr/local/cuda的常用位置,則可以查看/ usr/local/cuda/lib中的庫。其中一些在其名稱末尾會有多達3個數字,如4.1.28或5.0.35這些數字會告訴您cuda版本4.1.xx = cuda 4.1,5.0.xx = cuda 5.0使用ls/usr /本地/ cuda/lib或無限cuda安裝在您的服務器上。或者如果構建了samples/SDK,您可以運行deviceQuery示例,它會告訴您cuda版本。 –

回答

4

定義函數引用發生問題時,編譯發現功能的原型和沒有找到參考到鏈接期間的功能。爲了避免這種鏈接錯誤,你應該1)在一個命令中編譯鏈接整個文件,或者2)分離編譯和鏈接過程。我推薦後者如下:

nvcc -c main.cpp 
nvcc -c DeviceFunc.cu 
nvcc -c Kernel.cu 
nvcc main.o DeviceFunc.o Kernel.o -o main 

注意到你的代碼所示錯過含有人體Kernel函數的文件。我認爲Kernel函數的主體包含在Kernel.cu中。