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

相关推荐
Scott9999HH1 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社2 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海3 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖3 小时前
JDK 26 新特性详解
java·开发语言
马优晨4 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区6 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大6 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai7 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜7 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa7 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio