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