我的 C++ 项目main.cpp
,使用pgcpp
PGI 编译,调用了一个函数,该函数cuda()
在一个单独的文件中包含 CUDA 代码cuda.cu
,使用nvcc
. 除非我在函数声明和公共头文件中包装cuda()
函数,否则我会收到链接错误(未定义的引用)。extern "C"
没有extern "C"
(符号名称不匹配 => 未定义的引用):
$ nm main.o | grep -y cuda
U cuda__FPfPiT2iN32
$ nm cuda.o | grep -y cuda
T _Z13cudaPfPiS0_iS0_S0_S0_
使用extern "C"
(符号名称匹配 => 链接工作正常):
$ nm main.o | grep -y cuda
U cuda
$ nm cuda.o | grep -y cuda
T cuda
我的印象是nvcc
使用宿主 C++ 编译器来编译宿主代码,因此它会像在 C++ 中那样破坏符号名称?那我做错了什么?
编辑:这可能是由于nvcc
实际使用 GNU 编译器来编译gcc
主机代码,并且该编译器对名称的处理方式与 GNU 编译器不同pgcpp
吗?
EDIT2:我的系统有 pgcpp 14.9、gcc 4.4.7、nvcc/CUDA 6.5