如何使用 CMake 分别编译 *.cpp 和 *.cu?

Posted

技术标签:

【中文标题】如何使用 CMake 分别编译 *.cpp 和 *.cu?【英文标题】:How to use CMake to compile *.cpp and *.cu seperately? 【发布时间】:2021-12-19 12:30:23 【问题描述】:

我想实现一个 Matrix 类,我想使用 CUDA 来加速矩阵乘法。但是当我尝试编译源文件时。我遇到了一些问题。我知道我需要使用 NVCC 来编译 *.cu。但我不知道如何编写 CMakeLists.txt 来同时编译 *.cu 和 *.cpp。我尝试了很多在 Google 上找到的方法,但它们都不起作用。这是我当前的 CMakeLists.txt

cmake_minimum_required(VERSION 3.16)
project(Project_4 LANGUAGES CXX CUDA)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CUDA_STANDARD 14)
set(CMAKE_BUILD_TYPE RELEASE)

set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS ")
set(EXECUTABLE_OUTPUT_PATH $PROJECT_SOURCE_DIR/build)

find_package(CUDA REQUIRED)
include(FindCUDA)
include_directories($CUDA_INCLUDE_DIRS)
set(CUDA_NVCC_FLAGS $CUDA_NVCC_FLAGS -gencode arch=compute_30,code=sm_30)

include_directories(include)
aux_source_directory(src DIR_SRCS)

file(GLOB cu *.cu)
cuda_add_executable(cuda $DIR_SRCS $cu)

add_executable(Project_4 $DIR_SRCS)

set_target_properties(Project_4 PROPERTIES
        CUDA_SEPARABLE_COMPILATION ON)

那么编译的时候会报CMake Error at cuda_generated_ cuda_helper.cu.o.RELEASE.cmake:282。如果我这样写 CMakeLists.txt:

cmake_minimum_required(VERSION 3.16)
project(Project_4 LANGUAGES CXX CUDA)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CUDA_STANDARD 14)
set(CMAKE_BUILD_TYPE RELEASE)

set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS ")
set(EXECUTABLE_OUTPUT_PATH $PROJECT_SOURCE_DIR/build)

include_directories(include)
aux_source_directory(src DIR_SRCS)

find_package(CUDA REQUIRED)
include_directories($CUDA_INCLUDE_DIRS)
set(CUDA_NVCC_FLAGS $CUDA_NVCC_FLAGS -gencode arch=compute_30,code=sm_30)

add_executable(Project_4 $DIR_SRCS)

set_target_properties(Project_4 PROPERTIES
        CUDA_SEPARABLE_COMPILATION ON)

然后它会在我调用内核函数的地方报错error: expected primary-expression before "<" token。 我在网上找了很久。但是没有用。请帮助或尝试提供一些想法如何实现这一目标。我会很感激。谢谢。

【问题讨论】:

你试过这个链接了吗? developer.nvidia.com/blog/building-cuda-applications-cmake 【参考方案1】:

我为您创建了一个示例。它不是基于你的 cmake。但它对我有用,也许对你有帮助。

    克隆仓库:git clone -b cmake_cuda_example https://github.com/werto87/durak_computer_controlled_opponent.git

    安装:conan dependency manager

    安装:cuda toolkit

    在“durak_computer_controlled_opponent”文件夹中创建一个名为 build 的空文件夹

    进入该文件夹并在终端内运行“conan install .. --build missing”

    cmake ..

    cmake --build .

【讨论】:

以上是关于如何使用 CMake 分别编译 *.cpp 和 *.cu?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用cmake分别编译这两组源文件?

CMake/Ninja 试图编译已删除的“.cpp”文件

cmake:VS2015和GCC编译cpp_redis

cmake的缓存变量可以用于cpp源码中吗

CMake 不编译具有非标准扩展名的文件

cmake 生成汇编文件然后编译成可执行文件