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

use*_*358 10 c cuda linker-errors

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

main.c看起来像这样:

#include "my_cuda.h"

int main(int argc, char** argv){
   dummy_gpu();
}
Run Code Online (Sandbox Code Playgroud)

cuda.h看起来像这样:

#ifndef MY_DUMMY
#define MY_DUMMY

void dummy_gpu();

#endif
Run Code Online (Sandbox Code Playgroud)

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

#include <cuda_runtime.h>
#include "my_cuda.h"

__global__ void dummy_gpu_kernel(){
   //do something
}

void dummy_gpu(){
   dummy_gpu_kernel<<<128,128>>>();
}
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助.

tal*_*ies 21

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

这个问题有两种解决方案.第一个是dummy_gpu使用C链接定义,所以将你my_cuda.cu改为这样的东西:

extern "C" {
#include "my_cuda.h"
}

.....


extern "C"
void dummy_gpu(){
   dummy_gpu_kernel<<<128,128>>>();
}
Run Code Online (Sandbox Code Playgroud)

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

gcc -L/usr/local_rwth/sw/cuda/5.0.35/lib64 -o md.exe main.o my_cuda.o -lcuda -lcudart 
Run Code Online (Sandbox Code Playgroud)

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

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


Rob*_*lla 6

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