名称: qt-cmake-项目生成器 描述: 生成基于CMake的Qt项目,包含正确的模块依赖、交叉编译支持和现代化的Qt6配置 允许使用的工具: 读取, 写入, 编辑, Bash, Glob, Grep 标签: [qt, cmake, cpp, 跨平台, 构建]
qt-cmake-项目生成器
生成基于CMake的Qt项目配置,包含正确的模块依赖和交叉编译支持。此技能处理Qt6与CMake的集成、模块发现以及特定平台的构建配置。
功能
- 为Qt6项目生成现代化的CMake配置
- 配置Qt模块依赖(Core, Widgets, Quick, Network等)
- 设置交叉编译工具链
- 配置vcpkg/Conan包管理器集成
- 生成平台特定的构建配置
- 设置Qt部署脚本(windeployqt, macdeployqt)
- 配置静态与动态链接
- 为开发和CI生成CMake预设
输入模式
{
"类型": "对象",
"属性": {
"项目路径": {
"类型": "字符串",
"描述": "创建/更新Qt项目的路径"
},
"项目名称": {
"类型": "字符串",
"描述": "项目名称"
},
"qt版本": {
"类型": "字符串",
"默认": "6.6",
"描述": "目标Qt版本"
},
"qt模块": {
"类型": "数组",
"项": {
"枚举": ["Core", "Gui", "Widgets", "Quick", "Qml", "Network", "Sql", "Multimedia", "WebEngine", "Charts", "3D"]
},
"默认": ["Core", "Gui", "Widgets"]
},
"应用类型": {
"枚举": ["widgets", "quick", "console", "library"],
"默认": "widgets"
},
"目标平台": {
"类型": "数组",
"项": { "枚举": ["windows", "macos", "linux", "android", "ios", "wasm"] }
},
"包管理器": {
"枚举": ["none", "vcpkg", "conan"],
"默认": "none"
},
"cpp标准": {
"枚举": ["17", "20", "23"],
"默认": "17"
},
"生成预设": {
"类型": "布尔值",
"默认": true
}
},
"必需": ["项目路径", "项目名称"]
}
输出模式
{
"类型": "对象",
"属性": {
"成功": { "类型": "布尔值" },
"文件": {
"类型": "数组",
"项": {
"类型": "对象",
"属性": {
"路径": { "类型": "字符串" },
"描述": { "类型": "字符串" }
}
}
},
"构建命令": {
"类型": "对象",
"属性": {
"配置": { "类型": "字符串" },
"构建": { "类型": "字符串" },
"安装": { "类型": "字符串" }
}
},
"警告": { "类型": "数组", "项": { "类型": "字符串" } }
},
"必需": ["成功"]
}
生成的CMakeLists.txt示例
cmake_minimum_required(VERSION 3.21)
project(MyQtApp VERSION 1.0.0 LANGUAGES CXX)
# C++ 标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Qt 配置
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
# 查找Qt包
find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets)
# 源文件
set(SOURCES
src/main.cpp
src/mainwindow.cpp
src/mainwindow.h
src/mainwindow.ui
)
# 资源
set(RESOURCES
resources/resources.qrc
)
# 创建可执行文件
qt_add_executable(${PROJECT_NAME}
${SOURCES}
${RESOURCES}
)
# 链接Qt库
target_link_libraries(${PROJECT_NAME} PRIVATE
Qt6::Core
Qt6::Gui
Qt6::Widgets
)
# 平台特定设置
if(WIN32)
set_target_properties(${PROJECT_NAME} PROPERTIES
WIN32_EXECUTABLE TRUE
)
elseif(APPLE)
set_target_properties(${PROJECT_NAME} PROPERTIES
MACOSX_BUNDLE TRUE
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_SOURCE_DIR}/platform/macos/Info.plist"
)
endif()
# 安装
install(TARGETS ${PROJECT_NAME}
BUNDLE DESTINATION .
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
# Qt部署
qt_generate_deploy_app_script(
TARGET ${PROJECT_NAME}
OUTPUT_SCRIPT deploy_script
NO_UNSUPPORTED_PLATFORM_ERROR
)
install(SCRIPT ${deploy_script})
CMake预设
{
"版本": 6,
"配置预设": [
{
"名称": "default",
"显示名称": "默认",
"二进制目录": "${sourceDir}/build/${presetName}",
"缓存变量": {
"CMAKE_BUILD_TYPE": "Debug"
}
},
{
"名称": "release",
"继承": "default",
"显示名称": "发布",
"缓存变量": {
"CMAKE_BUILD_TYPE": "Release"
}
},
{
"名称": "windows-msvc",
"继承": "default",
"显示名称": "Windows MSVC",
"生成器": "Visual Studio 17 2022",
"架构": "x64",
"条件": {
"类型": "等于",
"左侧": "${hostSystemName}",
"右侧": "Windows"
}
},
{
"名称": "macos",
"继承": "default",
"显示名称": "macOS",
"生成器": "Ninja",
"缓存变量": {
"CMAKE_OSX_ARCHITECTURES": "x86_64;arm64"
},
"条件": {
"类型": "等于",
"左侧": "${hostSystemName}",
"右侧": "Darwin"
}
},
{
"名称": "linux",
"继承": "default",
"显示名称": "Linux",
"生成器": "Ninja",
"条件": {
"类型": "等于",
"左侧": "${hostSystemName}",
"右侧": "Linux"
}
}
],
"构建预设": [
{
"名称": "default",
"配置预设": "default"
},
{
"名称": "release",
"配置预设": "release"
}
]
}
交叉编译工具链
# toolchain-linux-aarch64.cmake
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_SYSROOT /opt/sysroots/aarch64-linux-gnu)
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
包管理器集成
vcpkg
# CMakeLists.txt
if(DEFINED ENV{VCPKG_ROOT})
set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake")
endif()
Conan
# conanfile.py
from conan import ConanFile
from conan.tools.cmake import cmake_layout
class MyQtAppConan(ConanFile):
settings = "os", "compiler", "build_type", "arch"
generators = "CMakeToolchain", "CMakeDeps"
def requirements(self):
self.requires("qt/6.6.0")
def layout(self):
cmake_layout(self)
最佳实践
- 使用qt_add_executable:对于Qt6,优先于add_executable
- 启用AUTOMOC/AUTOUIC/AUTORCC:自动元对象编译
- 使用CMake预设:简化不同环境的配置
- 版本化你的Qt需求:
find_package(Qt6 6.4 REQUIRED ...) - 使用现代CMake:target_*命令优于全局设置
- 生成部署脚本:使用Qt的部署工具
相关技能
qt-qml-组件生成器- QML组件创建qt-安装程序框架配置- 安装程序配置qt-测试夹具生成器- 测试设置
相关代理
qt-cpp-专家- Qt/C++专业知识桌面-ci-架构师- Qt项目的CI/CD