2

我有一个包含函数 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'

我错过了什么?

4

1 回答 1

5

问题可能是 C++ 名称修改。CUDA 代码是用 C++ 编译器编译的,而不是 C 编译器。如果您转储其中的内容,A.o您应该会找到一个类似于 的符号_Z1Av,而不是AC 编译器所期望的。

为了克服这个问题,您可以在A.cu文件中使用以下声明:

extern "C" void A(void)
{
    .......
}

这将告诉 C++ 编译器在编译代码时使用 C 约定,并且将适当命名的函数写入A.oC 编译器和链接器可以理解的目标文件。

于 2012-04-25T07:26:38.083 回答