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_executable和qt_add_resources命令 - Qt5 继续使用传统的
add_executable和qt5_add_resources
3. 资源文件管理
- 手动指定
.qrc资源文件路径,便于精确控制 - Qt6 中为每个资源文件设置
QT_RESOURCE_ALIAS属性 - 使用
qt_add_resources将资源嵌入到可执行文件中
4. 开发环境优化
- 通过
source_group命令实现 IDE 中的虚拟文件夹分组 - 设置
WIN32_EXECUTABLE和MACOSX_BUNDLE属性适配不同平台
5. 安装配置
- 定义了详细的安装规则,支持多种目标类型(BUNDLE、LIBRARY、RUNTIME等)
- 单独处理资源文件的安装路径
这个配置提供了完整的 Qt 项目构建解决方案,具备良好的可维护性和跨平台兼容性。