【问题标题】:CMake cannot find CUDA: "Could not find cmake module file: CMakeDetermineCUDACompiler.cmake"CMake 找不到 CUDA:“找不到 cmake 模块文件:CMakeDetermineCUDACompiler.cmake”
【发布时间】:2018-12-19 21:19:51
【问题描述】:

我正在尝试编写一个需要 cuda 功能的 CMake 文件。咨询this answer,我将此行添加到我的CMakeLists.txt:

set(CMAKE_CUDA_COMPILER  /usr/local/cuda-9.2/bin/nvcc)

但是当使用cmake 命令时它仍然会报错:

yuqiong@yuqiong-G7-7588:/media/yuqiong/DATA/alexnet/src/cpp/train$ cmake .
CMake Error: Could not find cmake module file: CMakeDetermineCUDACompiler.cmake
CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly.
Missing variable is:
CMAKE_CUDA_COMPILER_ENV_VAR
CMake Error: Could not find cmake module file: /media/yuqiong/DATA/alexnet/src/cpp/train/CMakeFiles/3.5.1/CMakeCUDACompiler.cmake
CMake Error: Could not find cmake module file: CMakeCUDAInformation.cmake
CMake Error: Could not find cmake module file: CMakeTestCUDACompiler.cmake
-- Configuring incomplete, errors occurred!
See also "/media/yuqiong/DATA/alexnet/src/cpp/train/CMakeFiles/CMakeOutput.log".

这似乎令人困惑,因为我不知道在哪里设置环境变量?知道为什么set 命令不能帮助 cmake 找到 nvcc 编译器吗?

以防万一,这是我的CMakeLists.txt

cmake_minimum_required(VERSION 3.5.1)
set(CMAKE_CUDA_COMPILER  /usr/local/cuda-9.2/bin/nvcc)

project(train LANGUAGES CXX CUDA)

set(CMAKE_CXX_STANDARD 14)
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )


add_executable(train train.cu)
target_link_libraries( train ${OpenCV_LIBS} )

【问题讨论】:

    标签: c++ cmake cuda


    【解决方案1】:

    实际上,你需要在 Linux 上安装 CMake 3.8 才能使用project(train LANGUAGES CUDA)。之前,您需要使用旧方法:

    FindPackage(CUDA)
    

    并手动添加库。

    失败是因为你的CMake版本没有原生支持CUDA,使用旧方法。

    【讨论】:

    • 我明白了,谢谢!如果问的不是太多,可以分享一个链接如何在cmake中添加库吗?另外,添加库后是否还需要将编译器指定为nvcc
    • 看看cliutils.gitlab.io/modern-cmake/chapters/packages/CUDA.html,它解释了这两种方式。
    • 非常感谢,这看起来是一个非常好的教程。
    【解决方案2】:

    对于偶然发现这个问题的任何人,这是我使用的最终 CMakeLists.txt 文件:

    cmake_minimum_required(VERSION 3.5.1)
    set(CMAKE_CUDA_COMPILER  /usr/local/cuda-9.2/bin/nvcc)
    
    project(train)
    include(FindCUDA)
    
    set(CMAKE_CXX_STANDARD 14)
    find_package( OpenCV REQUIRED )
    find_package(CUDA REQUIRED)
    set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} -gencode arch=compute_30,code=sm_30)
    
    include_directories( ${OpenCV_INCLUDE_DIRS} )
    
    cuda_add_executable(train train.cu)
    target_link_libraries( train ${OpenCV_LIBS} )
    

    【讨论】: