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 项目构建解决方案,具备良好的可维护性和跨平台兼容性。

相关推荐
代码or搬砖24 分钟前
Java集合-Set讲解
java·开发语言
艾上编程25 分钟前
第三章——爬虫工具场景之Python爬虫实战:学术文献摘要爬取,助力科研高效进行
开发语言·爬虫·python
明洞日记31 分钟前
【数据结构手册008】STL容器完全参考指南
开发语言·数据结构·c++
jllllyuz1 小时前
matlab使用B样条进行曲线曲面拟合
开发语言·matlab
ku_code_ku2 小时前
python bert_score使用本地模型的方法
开发语言·python·bert
小马哥编程2 小时前
【软考架构】滑动窗口限流算法的原理是什么?
java·开发语言·架构
水煎包V:YEDIYYDS8882 小时前
QT QML 实现的摇杆按钮,类似王者荣耀 左边方向导航键
qt·qml·摇杆按钮·导航键
云栖梦泽2 小时前
鸿蒙数据持久化实战:构建本地存储与云同步系统
开发语言·鸿蒙系统
wjs20242 小时前
《Ionic 侧栏菜单》
开发语言
祁思妙想2 小时前
linux常用命令
开发语言·python