Cuda C – 链接器错误 – 未定义的引用

我很难编译一个只包含两个文件的简单cuda程序。

main.c看起来像这样:

#include "my_cuda.h" int main(int argc, char** argv){ dummy_gpu(); } 

cuda.h看起来像这样:

 #ifndef MY_DUMMY #define MY_DUMMY void dummy_gpu(); #endif 

并且my_cuda.cu文件像这样松散:

 #include  #include "my_cuda.h" __global__ void dummy_gpu_kernel(){ //do something } void dummy_gpu(){ dummy_gpu_kernel<<>>(); } 

但是,如果我编译我总是收到以下错误:

 gcc -I/usr/local/cuda/5.0.35/include/ -c main.c nvcc -c my_cuda.cu gcc -L/usr/local_rwth/sw/cuda/5.0.35/lib64 -lcuda -lcudart -o md.exe main.o my_cuda.o main.o: In function `main': main.c:(.text+0x15): undefined reference to `dummy_gpu' collect2: ld returned 1 exit status 

谢谢您的帮助。

您遇到符号名称错误的问题。 nvcc使用主机C ++编译器来编译主机代码,这意味着符号名称修改应用于CUDA工具链发出的代码。

这个问题有两种解决方案。 第一个是使用C链接定义dummy_gpu ,因此将my_cuda.cu更改为以下内容:

 extern "C" { #include "my_cuda.h" } ..... extern "C" void dummy_gpu(){ dummy_gpu_kernel<<<128,128>>>(); } 

请注意,您需要将链接命令更改为:

 gcc -L/usr/local_rwth/sw/cuda/5.0.35/lib64 -o md.exe main.o my_cuda.o -lcuda -lcudart 

因为需要使用它们的目标文件之后指定CUDA共享库。

你的第二种选择是使用g++nvcc来进行链接,在这种情况下整个问题应该消失。

您有C / C ++链接问题。 nvcc以C ++方式装饰东西,但是你的gcc编译器正在使用C风格链接来处理事物。 修复它的一个简单方法是将main.c重命名为main.cpp,然后使用g ++而不是gcc重复命令