QT6+cmake+cuda的构建(windows)

文章目录

  • [1. 环境准备](#1. 环境准备)
  • [2. 项目结构](#2. 项目结构)
  • [3. 测试代码编写](#3. 测试代码编写)
    • [3.1 kernel.h](#3.1 kernel.h)
    • [3.2 kernel.cu](#3.2 kernel.cu)
    • [3.3 main.cpp](#3.3 main.cpp)
    • [3.4 CMakeLists.txt](#3.4 CMakeLists.txt)
  • [4. 编译结果](#4. 编译结果)

1. 环境准备

  1. QT6
  2. CUDA Toolkit
  3. cmake >= 3.8
  4. 编译器支持cuda
    -Windows: MSVC(visual studio)或MinGW-w64(有限支持,建议MSVC)

2. 项目结构

cmake 复制代码
cudaTest/
├──CmakeLists.txt
├──main.cpp
├──kernel.cu
└──kernel.h

3. 测试代码编写

3.1 kernel.h

c 复制代码
// kernel.h
#ifndef KERNEL_H
#define KERNEL_H

void launch_kernel();

#endif // KERNEL_H

3.2 kernel.cu

c 复制代码
// kernel.cu
#include "kernel.h"
#include <cuda_runtime.h>
#include <iostream>

__global__ void hello_kernel() {
    printf("Hello from GPU thread %d\n", threadIdx.x);
}

void launch_kernel() {
    hello_kernel<<<1, 10>>>();
    cudaDeviceSynchronize();
    cudaError_t err = cudaGetLastError();
    if (err != cudaSuccess) {
        std::cerr << "CUDA error: " << cudaGetErrorString(err) << std::endl;
    }
}

3.3 main.cpp

cpp 复制代码
// main.cpp
#include <QApplication>
#include <QLabel>
#include "kernel.h"

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    launch_kernel();  // 调用 CUDA 内核

    QLabel label("Hello Qt + CUDA!");
    label.show();

    return app.exec();
}

3.4 CMakeLists.txt

cmake 复制代码
cmake_minimum_required(VERSION 3.24)  # 推荐 3.24+ 以获得更好的 CUDA 支持

##############################【修改1】新增cuda编译环境##########################
project(MyQtCudaApp LANGUAGES CXX CUDA)
###############################################################################

# 启用 Qt6
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

# 查找 Qt6 组件
find_package(Qt6 REQUIRED COMPONENTS Core Widgets Gui)


##############################【修改2】新增cuda编译环境##########################
# 查找 CUDA(通常 CMake 自动处理,但显式声明更清晰)
enable_language(CUDA)

# 设置 CUDA 架构(根据你的 GPU 调整)
set(CMAKE_CUDA_ARCHITECTURES "75;86")  # 例如:RTX 20xx=75, RTX 30xx=86
###############################################################################


# 添加可执行文件(包含 .cpp 和 .cu)
add_executable(MyQtCudaApp
    main.cpp
    kernel.cu
)

# 链接 Qt6 库
target_link_libraries(MyQtCudaApp PRIVATE
    Qt6::Core
    Qt6::Widgets
    Qt6::Gui
)

# 设置 C++ 标准
set_target_properties(MyQtCudaApp PROPERTIES
    CXX_STANDARD 17
    CUDA_STANDARD 17
)

##############################【修改3】可选,新增cuda编译环境#####################
# 可选:设置 NVCC 编译选项
target_compile_options(MyQtCudaApp PRIVATE
    $<$<COMPILE_LANGUAGE:CUDA>:--extended-lambda>
    $<$<COMPILE_LANGUAGE:CUDA>:--expt-relaxed-constexpr>
)
###############################################################################

4. 编译结果

  • 代码可正常编辑
  • .cu代码会出现部分假错误,目前解决办法未继续探索(据查,是cuda和qt兼容性弱的原因)
    拟解决办法:在visual studio上编写cuda相关代码,验证正确后带入qt写界面进行测试
相关推荐
Laurence3 天前
CMake / Ninja 构建 Qt 项目报 undefined reference to __imp__ 错误的解决方法
qt·cmake·项目构建·undefined·ninja·__imp__
___波子 Pro Max.3 天前
CMake configure_file使用教程详解
cmake
D.不吃西红柿8 天前
CPM.cmake轻量级包管理器
c++·cmake·cpm.cmake
十五年专注C++开发22 天前
CMake基础: 在release模式下生成调试信息的方法
linux·c++·windows·cmake·跨平台构建
kimicsdn23 天前
opentelemetry-demo currency cpp 项目编译流程分享
c++·cmake·libprotobuf-dev
十五年专注C++开发25 天前
CMake进阶:模块模式示例FindOpenCL.cmake详解
开发语言·c++·cmake·跨平台编译
番茄灭世神1 个月前
基于VScode搭建GD32开发环境
arm开发·vscode·单片机·cmake·gd32
l1t1 个月前
在arm64 Linux系统上编译tdoku-lib的问题和解决
linux·运维·服务器·c语言·cmake
番茄灭世神1 个月前
基于VScode的C/C++环境搭建
vscode·cmake·gcc·c\c++·llvm·工具链搭建