cmake Qt模板

ops/2024/10/21 2:56:18/

一、常用模块

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

add_custom_command(TARGET ${PROJECT_NAME} POST_BUILDCOMMAND "${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_BUILDCOMMAND ${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} PUBLICQt6::CoreQt6::GuiQt6::WidgetsQt6::StateMachinecurl
)target_include_directories(${PROJECT_NAME} PRIVATE "./include")## 自动调用windeployqt找齐运行所需的dll
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILDCOMMAND ${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 COMPONENTSCoreGuiWidgetsStateMachineNetworkQmlQuickQuickControls2
)add_executable(${PROJECT_NAME}App.cppqml.qrc
)
set_target_properties(${PROJECT_NAME} PROPERTIES WIN32_EXECUTABLE FALSE)
target_link_libraries(${PROJECT_NAME} PUBLICQt6::CoreQt6::GuiQt6::WidgetsQt6::StateMachineQt6::NetworkQt6::QmlQt6::QuickQt6::QuickControls2
)target_include_directories(${PROJECT_NAME} PRIVATE "./include")add_custom_command(TARGET ${PROJECT_NAME} POST_BUILDCOMMAND ${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.ppmy.cn/ops/127160.html

相关文章

【Golang】踩坑记录:make()创建引用类型,初始值是不是nil!!

文章目录 起因二、得记住的知识点1. make()切片&#xff0c;初始化了吗&#xff1f;2. make()切片不同长度容量&#xff0c;append时的差别3. 切片是指向数组的指针吗&#xff1f;4. 切片扩容时&#xff0c;重新分配内存&#xff0c;原切片的数据怎么办&#xff1f; 三、咳咳&a…

【论文阅读】03-Diffusion Models and Representation Learning: A Survey

Abstract&#xff08;摘要&#xff09; 扩散模型是各种视觉任务中流行的生成建模方法&#xff0c;引起了人们的广泛关注它们可以被认为是 自监督学习方法【通过数据本身的结构和特征来训练模型&#xff0c;而不是依赖外部标签】 的一个独特实例&#xff0c;因为它们独立于标签注…

博科测试IPO上市丨为行业提供智能测试综合解决方案

近年来&#xff0c;汽车制造、大型基础设施建设以及新能源开发等领域&#xff0c;对高精度、高效率的测试解决方案需求迫切。为推动行业发展&#xff0c;博科测试通过多年的技术积累以及自主创新&#xff0c;围绕伺服液压测试和汽车测试试验领域&#xff0c;积累了多项核心技术…

spring如何解决bean循环依赖的问题

1、概述 spring中&#xff0c;存在A依赖B&#xff0c;同时B又依赖A的情况&#xff0c;这种情况下&#xff0c;spring如何进行bean初始化呢&#xff1f; Service public class A {Autowiredprivate B b; }Service public class B {Autowiredprivate A a; } 本文来解释这个问题…

vector的模拟实现

1.迭代器失效 在上一篇中因为插入导致的扩容&#xff0c;扩容则pos指向的是之前的空间&#xff0c;导致了野指针的出现&#xff0c;没有扩容&#xff0c;使pos的位置意义改变&#xff0c;由于数据挪动&#xff0c;pos不再指向原来的位置&#xff0c;认为上面俩种迭代器失效。(…

重构复杂简单变量之用子类替换类型码

子类替换类型码 是一种用于将类型码替换为子类。当代码使用类型码&#xff08;通常是 int、string 或 enum&#xff09;来表示对象的不同类别&#xff0c;并且这些类别的行为有所不同时&#xff0c;使用子类可以更加清晰地表达这些差异并减少复杂的条件判断。 一、什么时候使用…

音视频入门基础:H.264专题(19)——FFmpeg源码中,获取avcC封装的H.264码流中每个NALU的长度的实现

一、引言 从《音视频入门基础&#xff1a;H.264专题&#xff08;18&#xff09;——AVCDecoderConfigurationRecord简介》中可以知道&#xff0c;avcC跟AnnexB不一样&#xff0c;avcC包装的H.264码流中&#xff0c;每个NALU前面没有起始码。avcC通过在每个NALU前加上NALUnitL…

Whisper 音视频转写

Whisper 音视频转写 API 接口文档 api.py import os import shutil import socket import torch import whisper from moviepy.editor import VideoFileClip import opencc from fastapi import FastAPI, File, UploadFile, Form, HTTPException, Request from fastapi.respons…