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项目。
我正在尝试将一些 .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项目。