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

add_cuda_library outputing: Unresolved extern function

本文关键字:函数 外部 cuda library 输出 add      更新时间:2023-10-16

我正在尝试将一些.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 文件时,链接就不会发生。我收到以下错误:

[ 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

"未解析的外部功能点"是链接器应该在另一个源文件中找到的函数。

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

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

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

不再需要以这种方式链接到 cuda 库。您可能可以使用enable_language(CUDA),它将处理链接。

您可以查看本教程或 Nvidia 开发博客中的此示例