我有一个包含函数void A()的文件A.cu.我有另一个文件test_A.c,它调用cuda函数A()并且函数声明为
extern void A();
Run Code Online (Sandbox Code Playgroud)
现在我按如下方式编译和链接它们
nvcc -c -o A.o A.cu
gcc -o test_A test_A.c A.o /opt/cuda-4.0/cuda/lib64/libcudart.so
Run Code Online (Sandbox Code Playgroud)
我得到的错误就像
undefined reference to `A'
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
问题可能是C++名称错误.CUDA代码使用C++编译器编译,而不是使用C编译器编译.如果你转储内容A.o你应该找到一个类似的符号_Z1Av,而不是AC编译器所期望的.
要解决此问题,您可以在A.cu文件中使用以下声明:
extern "C" void A(void)
{
.......
}
Run Code Online (Sandbox Code Playgroud)
这将告诉C++编译器在编译代码时使用C约定,并且将适当命名的函数写入A.oC编译器和链接器可以理解的目标文件.