add_cuda_library outputing:未解析的外部函数

2024-05-02 18:00:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将一些.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需要什么才能正确链接文件。在


Tags: 模块文件addpackage链接mainlibraryfind
2条回答

因为您提到您直接使用LANGUAGES CUDA。您可以使用add_library()而不是{},因为cmake将其作为第一种语言支持。我想有些项目使用旧版cmake(<;3.8?)需要一些类似CUDA_ADD_LIBRARY CUDA_ADD_EXECUTABLE的东西。但是作为第一语言,你可以把它看作一个普通的c项目。在

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

您可以看看this tutorial或来自{a2}的这个示例

相关问题 更多 >