链接CUDA +普通C ++代码:未定义引用`__fatbinwrap_66_tmpxft_等

时间:2016-02-29 16:12:00

标签: c++ cuda linker

不知怎的,我的CUDA二进制构建过程已经搞砸了。所有.cu文件都很好地编译成.o文件,但是当我尝试链接时,我得到:

CMakeFiles/tester.dir/tester_intermediate_link.o: In function `__cudaRegisterLinkedBinary_66_tmpxft_00007a5f_00000000_16_cuda_device_runtime_compute_52_cpp1_ii_8b1a5d37':
/tmp/tmpxft_00006b54_00000000-2_tester_intermediate_link.reg.c:7: undefined reference to `__fatbinwrap_66_tmpxft_00007a5f_00000000_16_cuda_device_runtime_compute_52_cpp1_ii_8b1a5d37'

现在,我还没有在任何地方使用compute_52。我的nvcc命令行是:

/usr/local/cuda/bin/nvcc -M -D__CUDACC__ /home/joeuser/src/my_project/src/kernel_specific/elementwise/Add.cu -o /home/joeuser/src/my_project/CMakeFiles/tester.dir/src/kernel_specific/elementwise/tester_generated_Add.cu.o.NVCC-depend -ccbin /usr/bin/gcc-4.9.3 -m64 --std c++11 -D__STRICT_ANSI__ -Xcompiler ,\"-Wall\",\"-g\",\"-g\",\"-O0\" -gencode arch=compute_35,code=compute_35 -g -G --generate-line-info -DNVCC -I/usr/local/cuda/include -I/opt/cub -I/usr/local/cuda/include

我的链接行是:

/usr/bin/g++-4.9.3   -Wall -std=c++11 -g   some.o files.o here.o blah.o blahblah.o bar.cu.o baz.cu.o -o bin/myapp -rdynamic -Wl,-Bstatic -lcudart_static -Wl,-Bdynamic -lpthread -lrt -ldl /usr/lib/libboost_system.so /usr/lib/libboost_program_options.so -Wl,-Bstatic -lcudart_static -Wl,-Bdynamic -lpthread -lrt -ldl /usr/local/cuda/extras/CUPTI/lib64/libcupti.so -lnvToolsExt -lOpenCL /usr/lib/libboost_system.so /usr/lib/libboost_program_options.so /usr/local/cuda/extras/CUPTI/lib64/libcupti.so -lnvToolsExt -lOpenCL -Wl,-rpath,/usr/lib:/usr/local/cuda/extras/CUPTI/lib64 

我注意到我启用了单独的编译,似乎没有跳过我的中间链接阶段。

为什么会这样?

2 个答案:

答案 0 :(得分:1)

好吧,我不确定为什么我看到缺少对Compute 5.2调用的引用,但在link命令的末尾添加-lcudadevrt会使错误消失。

答案 1 :(得分:1)

CUDA具有可重定位和静态两种编译模式。
可重定位模式是某些配置所必需的,我们现在不再赘述。

如果要以可重定位模式-rdc=true进行编译,则需要Cuda设备运行时库。
该文件位于文件cudadevrt.lib中。
在某些情况下,将-lcudadevrt作为命令行开关提供给CUDA链接器可完成此工作,但例如MSVC,您还需要指定cudadebrt.lib作为链接依赖项。

enter image description here