我正在尝试将一些.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
需要什么才能正确链接文件。在
因为您提到您直接使用},因为cmake将其作为第一种语言支持。我想有些项目使用旧版cmake(<;3.8?)需要一些类似
LANGUAGES CUDA
。您可以使用add_library()
而不是{CUDA_ADD_LIBRARY CUDA_ADD_EXECUTABLE
的东西。但是作为第一语言,你可以把它看作一个普通的c项目。在以这种方式链接到cuda库不再是必要的了。您可能可以使用
enable_language(CUDA)
,它将负责链接。在您可以看看this tutorial或来自{a2}的这个示例
相关问题 更多 >
编程相关推荐