add_cuda_library 输出:未解析的外部函数

add_cuda_library outputing: Unresolved extern function

我正在尝试将一些 .cu 源文件编译成 python 模块。只要不超过一个文件,哪个就可以正常工作。 CMakeLists.txt 看起来像这样:

find_package(CUDA)
find_package(PythonLibs 3.7 REQUIRED)
find_package(pybind11)

file(GLOB_RECURSE sources ${SRC}/launcher.cu)

cuda_add_library(main SHARED ${SRC}/module.cpp ${sources})
target_link_libraries(main ${PYTHON_LIBRARIES} cudart)
set_target_properties(main PROPERTIES CUDA_SEPERABLE_COMPILATION ON)

以上文件会整齐地编译一个python模块

但是当 ${sources} 包含多个 .cu 文件时,linking 就不会发生。我收到以下错误:

[ 16%] Building NVCC (Device) object
CMakeFiles/main.dir/src/main_generated_launcher.cu.o ptxas fatal   :
Unresolved extern function '_ZN5StateIdE16WithinBoundariesEii'
CMake Error at main_generated_launcher.cu.o.cmake:279 (message):
 Error generating file
 [...]/DNA_PredatorPrey/build/CMakeFiles/main.dir/src/./main_generated_launcher.cu.o

"Unresolved extern function points" 是 link 用户应该在另一个源文件中找到的函数。

当在完全相同的一组文件上使用 add_executable(....) 而不是 cuda_add_library 时,它将编译成一个工作的可执行文件。

所以我正在寻找 cuda_add_library 需要什么才能正确 link 文件。

不再需要以这种方式链接到 cuda 库。您或许可以使用 enable_language(CUDA),它将负责链接。

你可以看看this tutorial or this example from Nvidia dev blogs

既然你提到你是直接使用 LANGUAGES CUDA。您可以只使用 add_library() 而不是 add_cuda_library() 因为 cmake 支持它作为第一语言。我想一些使用旧版本 cmake(<3.8?) 的项目需要像 CUDA_ADD_LIBRARY CUDA_ADD_EXECUTABLE 这样的东西。但是作为一门语言,你可以把它当作一个普通的c项目。