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

相关推荐
leon_zeng01 小时前
Qt Modern OpenGL 入门:从零开始绘制彩色图形
开发语言·qt·opengl
ceclar1232 小时前
C++范围操作(2)
开发语言·c++
一个尚在学习的计算机小白2 小时前
java集合
java·开发语言
IUGEI2 小时前
synchronized的工作机制是怎样的?深入解析synchronized底层原理
java·开发语言·后端·c#
z***I3942 小时前
Java桌面应用案例
java·开发语言
来来走走2 小时前
Android开发(Kotlin) LiveData的基本了解
android·开发语言·kotlin
明洞日记2 小时前
【数据结构手册002】动态数组vector - 连续内存的艺术与科学
开发语言·数据结构·c++
福尔摩斯张2 小时前
《C 语言指针从入门到精通:全面笔记 + 实战习题深度解析》(超详细)
linux·运维·服务器·c语言·开发语言·c++·算法
6***37943 小时前
Java安全
java·开发语言·安全