链接CUDA设备函数时遇test42未解析外部函数错误求助
问题原因与解决方法
你的错误出在最后一步编译命令中,直接使用a.cu会让nvcc重新编译a.cu的设备代码,此时编译器无法找到test42的定义(因为这一步没有关联b.fatbin),导致ptxas报错。正确的做法是先将a.cu编译为目标文件,再和设备链接后的c.o一起生成可执行文件。
正确操作步骤
编译b.cu为fatbin文件(这一步你已完成,确认命令正确):
nvcc -arch=sm_60 -fatbin -o somepath/b.fatbin b.cu将a.cu编译为目标文件(仅编译不链接):
nvcc -arch=sm_60 -c -o a.o a.cu执行设备链接,将a的目标文件和b的fatbin合并为设备链接目标文件:
nvcc -arch=sm_60 -dlink -o c.o a.o somepath/b.fatbin -lcudadevrt最后链接所有目标文件生成可执行程序:
nvcc -arch=sm_60 -o executable a.o c.o -lcudadevrt
关键说明
- 直接在最后一步用
a.cu而非a.o时,nvcc会重新处理a.cu的设备代码,此时没有引入b.fatbin,自然找不到test42的定义。 -dlink步骤必须包含a的目标文件,因为需要解析get42对test42的调用,将两个设备代码链接起来。
内容的提问来源于stack exchange,提问作者James Toaster
相关产品推荐
相关产品推荐

