问题描述
使用来自PGI的 pgcpp
编译的我的C ++项目 main.cpp
,调用一个函数 cuda()
包含单独文件中的CUDA代码 cuda.cu
,使用 nvcc
。除非我在函数声明和公共头文件中用 cuda()
函数包装 externC
获取链接错误(未定义的引用)。
没有 externC
:
$ nm main.o | grep -y cuda
U cuda__FPfPiT2iN32
$ nm cuda.o | grep -y cuda
T _Z13cudaPfPiS0_iS0_S0_S0_
使用 externC
(符号名称匹配=>链接工作正常):
$ nm main.o | grep -y cuda
U cuda
$ nm cuda.o | grep -y cuda
T cuda
这是我的印象, nvcc
使用宿主代码的主机C ++编译器,因此它会像C ++那样修改符号名称?
编辑:这可能是因为 nvcc
实际使用GNU编译器 gcc
为主机代码,并且这个编译器修改名称不同于 pgcpp
?
EDIT2:我的系统有pgcpp 14.9,gcc 4.4.7,nvcc / CUDA 6.5
nvcc
默认使用主机gcc / g ++(gnu)工具链。
PGI提供了两种略有不同的工具链来编译C ++代码。使用 pgcpp
工具调用一个工具链。此工具链不是 gnu兼容的,不一定会产生与gnu兼容的名称。使用 pgc ++
工具调用其他工具链,并将其标注为gnu兼容,并且应该生成与gnu兼容的名称调试。
在 nvcc
和PGI工具产生的对象之间链接这种类型的问题应该使用 pgc ++
工具
另外,使用CUDA 7现在可以使用PGI编译器( pgc ++
)作为 nvcc
的主机编译器。但是这不是这里问题的关键,虽然切换到主机编译器将以类似的方式修复链接问题。
在当前版本的(例如第xv页)和:
Note that pgc++
is now (2015) considered "default" and pgcpp
is listed as "deprecated."
这篇关于在CUDA和C ++中名称调整的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!