Qt CMake 项目构建配置详解

Qt CMake 项目构建配置详解

项目目录结构

基于提供的 CMake 配置,该项目采用标准的 Qt 项目结构:

复制代码
redis-admin/
├── CMakeLists.txt              # 根级别 CMake 配置文件
├── src/                        # 源代码主目录
│   ├── CMakeLists.txt          # 子 CMake 配置文件(当前配置内容)
│   ├── main.cpp                # 应用程序入口点
│   ├── constants/              # 常量定义目录
│   │   └── constants.h         # 公共常量头文件
│   ├── *.cpp                   # 其他源文件
│   ├── *.h                     # 头文件
│   └── *.ui                    # Qt Designer UI 文件
├── resources/                  # 资源文件目录
│   ├── styles.qrc              # 样式资源集合
│   ├── images.qrc              # 图像资源集合
│   ├── images/                 # 实际图像文件
│   └── styles/                 # 样式文件
└── ...

完整 CMake 配置内容

以下是完整的 CMake 配置文件内容,位于 src/ 目录中:

cmake 复制代码
# 使用GLOB_RECURSE自动收集源文件和头文件
file(GLOB_RECURSE SOURCES "*.cpp")
file(GLOB_RECURSE HEADERS "*.h")
file(GLOB_RECURSE UI_FILES "*.ui")

# 手动指定资源文件,使用相对路径
set(QRC_FILES
    resources/styles.qrc
    resources/images.qrc
)

# 创建可执行文件
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_add_executable(redis-admin
        MANUAL_FINALIZATION
        ${SOURCES}
        ${HEADERS}
        ${UI_FILES}
    )
else()
    add_executable(redis-admin
        ${SOURCES}
        ${HEADERS}
        ${UI_FILES}
    )
endif()

# 处理资源文件
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    # 为每个资源文件设置相对路径别名
    foreach(qrc_file ${QRC_FILES})
        get_filename_component(qrc_name ${qrc_file} NAME)
        set_source_files_properties(${qrc_file} PROPERTIES
            QT_RESOURCE_ALIAS ${qrc_name}
        )
    endforeach()
    
    qt_add_resources(redis-admin "app_resources"
        PREFIX "/"
        FILES ${QRC_FILES}
    )
else()
    # Qt5处理方式
    qt5_add_resources(RCC_SOURCES ${QRC_FILES})
    target_sources(redis-admin PRIVATE ${RCC_SOURCES})
endif()

# IDE虚拟文件夹分组
source_group("Sources" FILES ${SOURCES})
source_group("Headers" FILES ${HEADERS})
source_group("UI" FILES ${UI_FILES})
source_group("Resources" FILES ${QRC_FILES})
source_group("Constants" FILES "constants/constants.h")

# 设置目标属性
set_target_properties(redis-admin PROPERTIES
    WIN32_EXECUTABLE TRUE
    MACOSX_BUNDLE TRUE
    OUTPUT_NAME "redis-admin"
    # 设置PDB文件输出目录(Windows调试信息)
    VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}"
)

# 包含目录
target_include_directories(redis-admin PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}/constants
)

# 链接库
target_link_libraries(redis-admin PRIVATE
    Qt${QT_VERSION_MAJOR}::Widgets
)

# 添加编译定义
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    target_compile_definitions(redis-admin PRIVATE DEBUG=1)
endif()

# Qt6最终化
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_finalize_executable(redis-admin)
endif()

# 安装配置
install(TARGETS redis-admin
    BUNDLE DESTINATION .
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
)

# 安装资源文件(如果需要)
install(DIRECTORY resources/images/ DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/images)
install(DIRECTORY resources/styles/ DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/styles)

message(STATUS "${PROJECT_NAME} 配置完成")

配置关键特性解析

1. 文件自动收集机制

  • 使用 file(GLOB_RECURSE) 命令自动扫描并收集所有 .cpp.h.ui 文件
  • 这种方式简化了新增文件时的手动维护工作

2. Qt 版本兼容性处理

  • 通过条件判断 ${QT_VERSION_MAJOR} GREATER_EQUAL 6 实现 Qt5 和 Qt6 的兼容
  • Qt6 使用新的 qt_add_executableqt_add_resources 命令
  • Qt5 继续使用传统的 add_executableqt5_add_resources

3. 资源文件管理

  • 手动指定 .qrc 资源文件路径,便于精确控制
  • Qt6 中为每个资源文件设置 QT_RESOURCE_ALIAS 属性
  • 使用 qt_add_resources 将资源嵌入到可执行文件中

4. 开发环境优化

  • 通过 source_group 命令实现 IDE 中的虚拟文件夹分组
  • 设置 WIN32_EXECUTABLEMACOSX_BUNDLE 属性适配不同平台

5. 安装配置

  • 定义了详细的安装规则,支持多种目标类型(BUNDLE、LIBRARY、RUNTIME等)
  • 单独处理资源文件的安装路径

这个配置提供了完整的 Qt 项目构建解决方案,具备良好的可维护性和跨平台兼容性。

相关推荐
MATLAB代码顾问15 分钟前
Python实现蜂群算法优化TSP问题
开发语言·python·算法
jinanwuhuaguo36 分钟前
(第三十三篇)五月的文明奠基:OpenClaw 2026.5.2版本的文明级解读
android·java·开发语言·人工智能·github·拓扑学·openclaw
有一个好名字2 小时前
工具即双手 —— 从 Bash 到 Tool Dispatch Map
开发语言·chrome·bash
Lyyaoo.2 小时前
优惠券秒杀业务分析
java·开发语言
DevilSeagull2 小时前
MySQL(2) 客户端工具和建库
开发语言·数据库·后端·mysql·服务
MATLAB代码顾问3 小时前
改进遗传算法(IGA)求解作业车间调度问题(JSSP)——附MATLAB代码
开发语言·matlab
syker3 小时前
AIFerric深度学习框架:自研全栈AI基础设施的技术全景
开发语言·c++
HSunR3 小时前
dify 搭建ai作业批改流
开发语言·前端·javascript
代码不加糖3 小时前
2026 跨境电商独立站实战:从 0 到 1 搭建高转化 SaaS 商城(附源码)
开发语言·前端·javascript
时空系3 小时前
第9篇:成员功能——为结构体添加能力 Rust中文编程
开发语言·网络·rust