Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
我有一个包含函数 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'
我错过了什么?
问题可能是 C++ 名称修改。CUDA 代码是用 C++ 编译器编译的,而不是 C 编译器。如果您转储其中的内容,A.o您应该会找到一个类似于 的符号_Z1Av,而不是AC 编译器所期望的。
A.o
_Z1Av
A
为了克服这个问题,您可以在A.cu文件中使用以下声明:
A.cu
extern "C" void A(void) { ....... }
这将告诉 C++ 编译器在编译代码时使用 C 约定,并且将适当命名的函数写入A.oC 编译器和链接器可以理解的目标文件。