链接错误:函数____cudaRegisterAll中引用的未解析的外部符号___cudaRegisterLinkedBinary

时间:2012-12-14 18:27:48

标签: visual-studio-2008 cuda

我正在使用CUDA 5.0开发Visual Studio 2008。我使用CUDA Runtime API作为构建规则 我正在尝试编译一个包含main函数和一个全局内核的test.cu文件。 main函数和内核都包含外部库函数调用,我使用相同的CUDA环境编译,启用了可重定位设备代码标志,NVCC编译类型为-c。 test.cu编译得很好,但在链接期间它会输出以下错误:

1>Linking...
1>test.cu.obj : error LNK2019: unresolved external symbol ___cudaRegisterLinkedBinary_43_tmpxft_00001888_00000000_8_test_cpp1_ii_98e63e3a referenced in function "void __cdecl __sti____cudaRegisterAll_43_tmpxft_00001888_00000000_8_test_cpp1_ii_98e63e3a(void)" (?__sti____cudaRegisterAll_43_tmpxft_00001888_00000000_8_test_cpp1_ii_98e63e3a@@YAXXZ)

我搜索了__cudaRegisterLinkedBinary并发现它是在CUDA v5.0中的crt / host_rintime.h中定义的,但在v4.2中没有这样的东西。

crt/host_runtime.h:#define __REGISTERFUNCNAME_CORE(X) __cudaRegisterLinkedBinary##X 
crt/host_runtime.h:#define ____cudaRegisterLinkedBinary(X)

所以我怀疑它可能与v5.0中添加的单独编译功能有关,我是否正确?

有人可以帮我解决错误吗? 如果由于.cu文件的单独编译而出现问题,那么它是否意味着我必须将所有内核放在一个单独的.cu文件中来解决它?

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:0)

我遇到了同样的错误。看来我的问题与单独的编译有关。 (我是CUDA的新手,所以如果有人可以确认或提供更好的解释,我将有责任。)

首先,我对Visual Studio的修复是转到 属性-> CUDA C / C ++->通用 ,然后将“是”切换为“ 生成可重定位设备代码 ”。根据{{​​3}},您还需要确保“ NVCC编译类型 ”是“ 生成混合对象文件 ”。

根据NVCC文档,与第一个修复程序有关的问题是NVCC将可重定位的设备代码嵌入到主机对象中,并调用nvlink链接设备cade,然后将其与主机对象链接以形成最终程序。 。第二个修复程序的问题是从“ .cu”文件隐式生成了CUDA主机代码。该主机代码需要传递到主机链接器。

文档链接为:https://forums.developer.nvidia.com/t/how-to-separately-compile-a-kernel-in-visual-studio/80385https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#nvcc-options-for-separate-compilation

相关问题