使用原生 CUDA 支持 CMake 在 C++ 目标中获取 CUDA 包含目录?

Obtaining the CUDA include dir in C++ targets with native-CUDA-support CMake?

在 CMake 3.8 版中,引入了对 CUDA 作为语言的原生支持。当项目将 CUDA 作为其语言之一时,CMake 将继续定位 CUDA(例如,它定位 nvcc 二进制文件)。

只要你只编译 CUDA 代码——这就足够了。但是,如果您想在该项目中编译 C++ 目标怎么办? CUDA 包含不会自动 -I,并且 CMakeCache.txt 似乎不包含任何地方的 CUDA 包含路径。

即使 CMake 本身已经找到了 CUDA,我真的还需要 运行 一些东西 find_package(CUDA 9.0 REQUIRED) 吗?或者 - 我可以通过其他方式获取包含目录吗?

CMAKE_CUDA_COMPILER设置的编译器使用的include目录可以从CMake变量CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES.[=22=中获取]

要获取 ,最好的方法可能是结合使用 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 错误跟踪器上进行了讨论:Provide target libraries for cuda libraries


更新:CMake 3.17.0 添加了 FindCUDAToolkit

从 CMake 3.17.0 开始,最好的方法是使用 CUDAToolkit 模块,而不是手动执行 find_library()

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 模块文件进行最少的更改。