背景:
最近在看一篇kyber GPU实现的论文,有些细节不是很明白,就想将源码跑起来调试一下。源码应该是直接敲nvcc命令行运行的,嫌太麻烦,于是想改成CMake项目。自己用nvcc命令跑过可以运行,所以确认源码是没有什么问题的,加了CMakeList后报错undefined reference to ***, 如下:
解决方法:
CMakeList中加入:
set(CMAKE_CUDA_SEPARABLE_COMPILATION ON)
原理:
这个 CMake 选项用于控制是否启用 CUDA 源文件的可分离编译(separable compilation)功能。
CUDA 编译过程分为两个阶段 - device 部分和 host 部分。当启用可分离编译时,CUDA 编译器会为每个 CUDA 内核生成单独的目标文件。这些目标文件可以独立链接,提高编译和链接的效率。
如果没有启用可分离编译,CUDA 编译器在生成目标文件时,会将所有的 device 代码和 host 代码全部打包到一个目标文件中。在链接阶段,如果有某些 CUDA 内核的符号没有被正确解析,就会出现 undefined reference to 的错误。
CUDA 程序通常需要链接 CUDA 运行时库,比如 cudart。如果没有正确设置这些依赖库,同样会导致链接错误。