首页 > 解决方案 > add_cuda_library 输出:未解析的外部函数

问题描述

我正在尝试将一些 .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正确链接文件的要求。

标签: pythonc++cmakecudapybind11

解决方案


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

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


推荐阅读