news 2026/6/10 21:45:00

Qt优雅的组织项目结构三(使用CMakeLists进行模块化配置)——————附带详细示例代码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Qt优雅的组织项目结构三(使用CMakeLists进行模块化配置)——————附带详细示例代码

文章目录

  • Qt优雅的组织项目结构三(使用CMakeLists进行模块化配置)——————附带详细示例代码
    • 0 背景
    • 1 实践
    • 2 扩展
    • 附录

Qt优雅的组织项目结构三(使用CMakeLists进行模块化配置)——————附带详细示例代码

0 背景

之前写过使用.cmake来进行项目的分模块化管理,但是发现分层后的项目结构并不是十分清晰,不同模块的代码还是混在了一起,而不是每个模块的代码都单独分离出来。子模块还是公用着主模块的构建配置。

使用.cmake前:

使用.cmake后:

因此这里使用CmakeLists.txt来对项目进行分模块化管理。可以将子项目完全独立管理,每个子项目可以有自己的构建配置

使用子模块CMakeLists.txt前:

使用子模块CMakeLists.txt后:


可以看到子模块的代码被完全分离出来,更方便进行管理。

1 实践

  • 1,创建项目;


  • 2,修改CMakeLists.txt的内容为;
# 设置cmake的最低版本cmake_minimum_required(VERSION3.16)# 定义项目名称、项目版本、变成语言project(TestCMakeLists VERSION0.1LANGUAGES CXX)# 自动处理界面文件set(CMAKE_AUTOUIC ON)# 自动处理信号与槽set(CMAKE_AUTOMOC ON)# 自动处理资源文件set(CMAKE_AUTORCC ON)# 指定 C++语言标准版本为C++17set(CMAKE_CXX_STANDARD17)# 强制要求指定的标准必须被满足。如果不支持C++17,CMake 配置阶段会直接报错并终止,不会尝试降级编译set(CMAKE_CXX_STANDARD_REQUIRED ON)# 保证代码的跨平台可移植性。 禁止编译器使用 GNU 扩展(如 GCC 的 gnu++17)或其他非标准的编译器扩展,强制使用严格的 ISO C++标准(即 c++17)。set(CMAKE_CXX_EXTENSIONS OFF)# 寻找Qt版本,并精确加载具体的 Qt 版本配置。find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)find_package(Qt${QT_VERSION_MAJOR}REQUIRED COMPONENTS Widgets)set(PROJECT_NAME"TestCMakeLists")set(PROJECT_SOURCES main.cpp)# 调用编译器(如 `g++,cl.exe`)将源代码编译成目标文件`(.o 或.obj)`, # 然后调用链接器将这些目标文件和依赖库链接成一个完整的、操作系统可以直接加载的二进制文件`exe`add_executable(${PROJECT_NAME}${PROJECT_SOURCES})# 把库链接到目标执行程序上target_link_libraries(${PROJECT_NAME}PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)# 为构建目标设置特定的属性(发布专业、规范的软件时,必不可少)set_target_properties(${PROJECT_NAME}PROPERTIES WIN32_EXECUTABLE TRUE)

把main函数修改为:

// #include "mainwindow.h"#include<QApplication>intmain(intargc,char*argv[]){QApplicationa(argc,argv);// MainWindow w;// w.show();returna.exec();}
  • 3,新建form文件夹,把UI相关的文件移到文件夹中;
  • 4,在form文件中,新建CMakeLists.txt文件,然后在根目录的CMakeLists.txt中添加如下内容,并重新构建;

放到add_executable之前:

# 将子项目作为独立模块管理add_subdirectory(Form)

修改后的文件为:

# 设置cmake的最低版本cmake_minimum_required(VERSION3.16)# 定义项目名称、项目版本、变成语言project(TestCMakeLists VERSION0.1LANGUAGES CXX)# 自动处理界面文件set(CMAKE_AUTOUIC ON)# 自动处理信号与槽set(CMAKE_AUTOMOC ON)# 自动处理资源文件set(CMAKE_AUTORCC ON)# 指定 C++语言标准版本为C++17set(CMAKE_CXX_STANDARD17)# 强制要求指定的标准必须被满足。如果不支持C++17,CMake 配置阶段会直接报错并终止,不会尝试降级编译set(CMAKE_CXX_STANDARD_REQUIRED ON)# 保证代码的跨平台可移植性。 禁止编译器使用 GNU 扩展(如 GCC 的 gnu++17)或其他非标准的编译器扩展,强制使用严格的 ISO C++标准(即 c++17)。set(CMAKE_CXX_EXTENSIONS OFF)# 寻找Qt版本,并精确加载具体的 Qt 版本配置。find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)find_package(Qt${QT_VERSION_MAJOR}REQUIRED COMPONENTS Widgets)set(PROJECT_NAME"TestCMakeLists")set(PROJECT_SOURCES main.cpp)# (新添加内容)将子项目作为独立模块管理add_subdirectory(Form)# 调用编译器(如 `g++,cl.exe`)将源代码编译成目标文件`(.o 或.obj)`, # 然后调用链接器将这些目标文件和依赖库链接成一个完整的、操作系统可以直接加载的二进制文件`exe`add_executable(${PROJECT_NAME}${PROJECT_SOURCES})# 把库链接到目标执行程序上target_link_libraries(${PROJECT_NAME}PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)# 为构建目标设置特定的属性(发布专业、规范的软件时,必不可少)set_target_properties(${PROJECT_NAME}PROPERTIES WIN32_EXECUTABLE TRUE)

重写构建项目,得到新的项目结构:

  • 5,修改form文件夹中的CMakeLists.txt的内容为下面的内容,然后重新构建;
# 设置cmake的最低版本cmake_minimum_required(VERSION3.16)# 定义项目名称、项目版本、变成语言project(FORM VERSION0.1LANGUAGES CXX)# 自动处理界面文件set(CMAKE_AUTOUIC ON)# 自动处理信号与槽set(CMAKE_AUTOMOC ON)# 自动处理资源文件set(CMAKE_AUTORCC ON)set(PROJECT_NAME"FORM")# 设置源文件set(SOURCES mainwindow.cpp)# 设置头文件set(HEADERS mainwindow.h)# 设置UI文件set(FORMS mainwindow.ui)# 创建动态链接库add_library(${PROJECT_NAME}STATIC ${SOURCES}${HEADERS}${FORMS})set(FORM_INCLUDE_DIRS"form/")# 链接Qt库target_link_libraries(FORM PRIVATE Qt5::Widgets)# 设置库的包含目录target_include_directories(FORM PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

  • 6 ,修改根目录下的CMakeLists.txt文件,然后更改main函数;

末尾添加如下内容:

# 把库链接到目标执行程序上target_link_libraries(${PROJECT_NAME}PRIVATE FORM)

修改后CMakeLists.txt文件为:

# 设置cmake的最低版本cmake_minimum_required(VERSION3.16)# 定义项目名称、项目版本、变成语言project(TestCMakeLists VERSION0.1LANGUAGES CXX)# 自动处理界面文件set(CMAKE_AUTOUIC ON)# 自动处理信号与槽set(CMAKE_AUTOMOC ON)# 自动处理资源文件set(CMAKE_AUTORCC ON)# 指定 C++语言标准版本为C++17set(CMAKE_CXX_STANDARD17)# 强制要求指定的标准必须被满足。如果不支持C++17,CMake 配置阶段会直接报错并终止,不会尝试降级编译set(CMAKE_CXX_STANDARD_REQUIRED ON)# 保证代码的跨平台可移植性。 禁止编译器使用 GNU 扩展(如 GCC 的 gnu++17)或其他非标准的编译器扩展,强制使用严格的 ISO C++标准(即 c++17)。set(CMAKE_CXX_EXTENSIONS OFF)# 寻找Qt版本,并精确加载具体的 Qt 版本配置。find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)find_package(Qt${QT_VERSION_MAJOR}REQUIRED COMPONENTS Widgets)set(PROJECT_NAME"TestCMakeLists")set(PROJECT_SOURCES main.cpp)# 将子项目作为独立模块管理add_subdirectory(Form)# 调用编译器(如 `g++,cl.exe`)将源代码编译成目标文件`(.o 或.obj)`, # 然后调用链接器将这些目标文件和依赖库链接成一个完整的、操作系统可以直接加载的二进制文件`exe`add_executable(${PROJECT_NAME}${PROJECT_SOURCES})# 把库链接到目标执行程序上target_link_libraries(${PROJECT_NAME}PRIVATE FORM)target_link_libraries(${PROJECT_NAME}PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)# 为构建目标设置特定的属性(发布专业、规范的软件时,必不可少)set_target_properties(${PROJECT_NAME}PROPERTIES WIN32_EXECUTABLE TRUE)

然后,修改main函数的代码为:

//#include "mainwindow.h" //这种方式也可以#include"form/mainwindow.h"#include<QApplication>intmain(intargc,char*argv[]){QApplicationa(argc,argv);MainWindow w;w.show();returna.exec();}

重新构建,运行代码即可。

2 扩展

名称链接
pri模块化管理代码链接
.cmake模块化管理代码链接
CMakeLists.txt模块化管理代码链接

附录

完整的项目代码见此。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 14:10:31

当FPGA遇上NVMe舰队:一次硬件加速的存储狂欢

基于NVMEOF和RNIC实现RDMA上NVME存储扩展fpga实现&#xff0c;通过RoCE连接多个SSD终端。 包含&#xff1a; nvmof和rnic的ip源代码&#xff0c; 有参考设计工程&#xff0c; 上位机软件&#xff0c;计算机驱动&#xff0c;凌晨三点的实验室里&#xff0c;调试器的绿灯第三次熄…

作者头像 李华
网站建设 2026/6/10 13:05:50

BUPT网络安全之虚拟专用网实验(实验四)

虚拟专用网实验实验目的1.1Windows IPSec实验通过实验掌握虚拟专用网的实现原理、协议和结构&#xff0c;理解并掌握在 Cisco 网络环境下 IPSec VPN&#xff08;IP 协议安全协议&#xff09;配置的方法&#xff0c;理解并掌握在 Windows 操作系统中IPSec&#xff08;IP 协议安全…

作者头像 李华
网站建设 2026/6/10 13:09:26

基于VUE的网络安全技术课程系统[VUE]-计算机毕业设计源码+LW文档

摘要&#xff1a;随着互联网的飞速发展&#xff0c;网络安全问题日益凸显&#xff0c;网络安全技术课程的重要性也与日俱增。为了提高该课程的管理效率与学习体验&#xff0c;本文设计并实现了基于VUE的网络安全技术课程系统。该系统涵盖系统用户管理、课程类别管理、课程模块管…

作者头像 李华
网站建设 2026/6/9 19:51:40

又一款带采集的微信群导航系统源码

源码介绍&#xff1a;独家对接 5 大流量公域平台&#xff0c;每天采集 500 优质群聊&#xff0c;扫码加群转化率超高&#xff0c;亲测日均引流 100&#xff0c;手机电脑都能用&#xff0c;操作简单到爆 适合人群&#xff1a;需要精准客源的商家 / 企业 社群运营从业者 私域流量…

作者头像 李华
网站建设 2026/6/10 1:05:42

KaiGe超强编程助手web开源

源码介绍&#xff1a;一款专业的 Web 端编程辅助工具&#xff0c;基于 Python Flask 框架开发&#xff0c;为开发者提供丰富的编程相关功能和便捷的代码处理服务。下载地址&#xff08;无套路&#xff0c;无须解压密码&#xff09;https://pan.quark.cn/s/436f4f872b61源码截图…

作者头像 李华
网站建设 2026/6/10 12:50:31

HeyGem.ai视频生成性能瓶颈突破指南

HeyGem.ai视频生成性能瓶颈突破指南 【免费下载链接】HeyGem.ai 项目地址: https://gitcode.com/GitHub_Trending/he/HeyGem.ai 在AI视频生成技术快速发展的今天&#xff0c;许多开发者在使用HeyGem.ai进行数字人视频创作时都曾遭遇过这样的困扰&#xff1a;明明硬件配…

作者头像 李华