在CMake版本3.8中,引入了对CUDA作为一种语言的本地支持。当一个项目将数据自动化系统作为其语言之一时,CMake将着手定位数据自动化系统(例如,它定位nvcc二进制文件)。
只要你只编译数据自动化系统代码--这就足够了。但是,如果您想在该项目中编译一个C++目标,怎么办?数据自动化系统包含的不是自动的-I
'ed,而且CMakeCache.txt
似乎不包含任何地方的CUDA包含路径。
我是否真的必须运行一些find_package(CUDA 9.0 REQUIRED)
,即使CMake本身已经定位到了数据自动化系统?或者-我可以以其他方式获得包含目录吗?
发布于 2018-08-09 14:40:13
包含由CMAKE_CUDA_COMPILER
设置的编译器所使用的目录,可以从CMake变量CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES
中检索它们。
要获得库,最好的方法可能是结合使用find_library()
和CMAKE_CUDA_IMPLICIT_LINK_DIRECTORIES
。
示例:
cmake_minimum_required(VERSION 3.9)
project(MyProject VERSION 1.0)
enable_language(CUDA)
find_library(CUDART_LIBRARY cudart ${CMAKE_CUDA_IMPLICIT_LINK_DIRECTORIES})
add_executable(
binary_linking_to_cudart
my_cpp_file_using_cudart.cpp
)
target_include_directories(
binary_linking_to_cudart
PRIVATE
${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES}
)
target_link_libraries(
binary_linking_to_cudart
${CUDART_LIBRARY}
)
在CMake bug跟踪器:为cuda库提供目标库上也讨论了这个问题。
更新: CMake 3.17.0添加FindCUDAToolkit
与手工执行find_library()
不同,CMake 3.17.0中最好的方法是使用CUDAToolkit
模块。
find_package(CUDAToolkit)
add_executable(
binary_linking_to_cudart
my_cpp_file_using_cudart.cpp
)
target_link_libraries(binary_linking_to_cudart PRIVATE CUDA::cudart)
为了支持早期的CMake版本,您可以在存储库中以最小的更改发布CUDATookit
模块文件。
发布于 2022-07-11 21:24:16
现在,使用CMake 3.18及更高版本,您可以通过检查find_package(CUDAToolkit)
提供的目标来获得所需的大部分内容--即使CUDA已经找到了CUDA编译器,也确实需要这些目标。但实际上,您可能只依赖于其中一个目标,并且避免直接使用包含目录。
PS --如果您碰巧使用了cuda包装器 (例如通过find_package(cuda-api-wrappers)
),它将为您处理依赖关系。
https://stackoverflow.com/questions/51756562
复制相似问题