如何使用 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?的主要内容,如果未能解决你的问题,请参考以下文章