当前位置: 首页 > article >正文

cmake Qt模板

一、常用模块

1. 构建完成后自动调用windeployqt打包

add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
        COMMAND "${QT_PATH}/bin/windeployqt.exe" "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.exe"
)
  1. 需要将QT_PATH设为Qt的安装目录。
  2. 还可以用--dir指定打包时dll存放的目录。
  3. 打包QML项目需要用--qmldir指定.qml源文件路径。

2. 构建完成后自动拷贝第三方库

以curl为例:

find_package(curl REQUIRED MODULE)
target_link_libraries(${PROJECT_NAME} PUBLIC
		...
        curl
)

add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:curl> $<TARGET_FILE_DIR:${PROJECT_NAME}>
)

二、模板

1. Windows下CMake Qt Widgets项目

这里采用了FILE GLOB自动添加所有cpp、h,这样有利有弊,也可以直接把文件写在add_executable(),看个人喜好。
目录结构是这样的:

.
├── 3rdparty
│   ├── libcurl-vc-x64-release-dll-ipv6-sspi-schannel
│   │
│   └── libcurl-vc-x86-release-dll-ipv6-sspi-schannel
│          
├── include
├── src
└── ui
cmake_minimum_required(VERSION 3.20)
project(FreeFTPClient LANGUAGES CXX)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

## 添加一些第三方库
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/3rdparty/libcurl-vc-x64-release-dll-ipv6-sspi-schannel")
## 设置Qt库安装路径
set(QT_PATH "E:/Qt/6.5.3/msvc2019_64")
set (CMAKE_PREFIX_PATH ${QT_PATH})
find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets StateMachine)
find_package(curl REQUIRED MODULE)

FILE(GLOB INCLUDE "include/*.h" "include/*.hpp")
FILE(GLOB UI "ui/*.ui")
FILE(GLOB SRC "src/*.cpp")

set(CMAKE_AUTOUIC_SEARCH_PATHS "./ui")
set(PROJECT_SOURCES ${INCLUDE} ${UI} ${SRC})

add_executable(${PROJECT_NAME} ${PROJECT_SOURCES})
set_target_properties(${PROJECT_NAME} PROPERTIES WIN32_EXECUTABLE FALSE)
target_link_libraries(${PROJECT_NAME} PUBLIC
        Qt6::Core
        Qt6::Gui
        Qt6::Widgets
        Qt6::StateMachine
        curl
)

target_include_directories(${PROJECT_NAME} PRIVATE "./include")

## 自动调用windeployqt找齐运行所需的dll
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:curl> $<TARGET_FILE_DIR:${PROJECT_NAME}>
        COMMAND ${CMAKE_COMMAND} -E remove_directory "${CMAKE_CURRENT_BINARY_DIR}/windeployqt"
        COMMAND "${QT_PATH}/bin/windeployqt.exe" --dir "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.exe"
)

2. windows QML项目

cmake_minimum_required(VERSION 3.20)
project(FreeFTPClient LANGUAGES CXX)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(QT_PATH "E:/Qt/6.5.3/msvc2019_64")
set(CMAKE_PREFIX_PATH ${QT_PATH})
find_package(Qt6 REQUIRED COMPONENTS
        Core
        Gui
        Widgets
        StateMachine
        Network
        Qml
        Quick
        QuickControls2
)

add_executable(${PROJECT_NAME}
        App.cpp
        qml.qrc
)
set_target_properties(${PROJECT_NAME} PROPERTIES WIN32_EXECUTABLE FALSE)
target_link_libraries(${PROJECT_NAME} PUBLIC
        Qt6::Core
        Qt6::Gui
        Qt6::Widgets
        Qt6::StateMachine
        Qt6::Network
        Qt6::Qml
        Qt6::Quick
        Qt6::QuickControls2
)

target_include_directories(${PROJECT_NAME} PRIVATE "./include")

add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E remove_directory "${CMAKE_CURRENT_BINARY_DIR}/windeployqt"
        COMMAND "${QT_PATH}/bin/windeployqt.exe" --qmldir "${CMAKE_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.exe"
)


http://www.kler.cn/news/353282.html

相关文章:

  • Flink 窗口触发器Triggers
  • IDEA中我常用的快捷键
  • el-table在某些条件下禁止选中
  • 爬虫之数据存储====Excel
  • web基础+PhpStrom+JS+CSS+html
  • C++ 进阶:类相关特性的深入探讨
  • dayjs日期格式化,开发uniapp或unicloud前后端进行时间格式转换
  • Linux——DNS服务器正向解析搭建教程
  • Java使用原生HttpURLConnection实现发送HTTP请求
  • Scala的flatten函数
  • Spring Boot构建高效医疗病历B2B交互平台
  • 1992-2022年全国各省产业集聚水平测算数据(含原始数据+计算过程+结果)(无缺失)
  • 【ROS实操六】launch的使用
  • python yfinance 下载金融数据,股票数据
  • 设计模式02-桥接模式(Java)
  • MySQL数据的导出
  • IJKPlayer源码分析-整体结构
  • 智慧园区管理:构建高效、安全、智能的园区环境
  • 当你不会介绍自己的产品和系统时,不妨看看大厂是如何做的
  • Python 如何处理大规模数据库表的迁移与数据迁移的高效执行
  • 微信小程序使用wx.navigateTo路由跳转层级限制
  • 2024-10-16 问AI: [AI面试题] 描述遗传算法的概念
  • MATLAB基础应用精讲-【数模应用】Bland-Altman图(附python和R语言代码实现)
  • Python 3.13 中的 7 个新类型特性
  • 第五课:Python学习之if语句
  • 小型洗衣机什么牌子好又便宜?诚意盘点五款绝佳内衣洗衣机!