当前位置: 首页 > ds >正文

完整的 VS Code + CMake + Qt + GCC 项目构建方案:EXE 程序与多个 DLL 库

完整的 VS Code + CMake + Qt + GCC 项目构建方案:EXE 程序与多个 DLL 库

在本文中,我们将介绍如何构建一个包含 EXE 程序和多个 DLL 库的项目,适用于 VS Code + CMake + Qt + GCC 开发环境。这个方案为一个模块化的项目结构,使得代码清晰且易于扩展和维护。

项目目录结构

首先,我们设计一个典型的项目目录结构,它将 EXE 程序、多个 DLL 库和公共头文件分开管理。以下是我们推荐的目录结构:

my_project/
├── CMakeLists.txt                # 根 CMake 配置文件
├── build/                        # 编译输出目录 (由 CMake 创建)
├── src/                          # 源代码目录
│   ├── exe/                      # EXE 程序代码目录
│   │   ├── main.cpp              # 主程序源代码
│   │   ├── mainwindow.cpp        # 主窗口源代码(如果有)
│   │   └── mainwindow.h          # 主窗口头文件(如果有)
│   └── dlls/                     # DLL 库代码目录
│       ├── lib1/                 # 第一个 DLL 库
│       │   ├── lib1.cpp          # DLL 库源代码
│       │   └── lib1.h            # DLL 库头文件
│       ├── lib2/                 # 第二个 DLL 库
│       │   ├── lib2.cpp          # DLL 库源代码
│       │   └── lib2.h            # DLL 库头文件
│       └── lib3/                 # 第三个 DLL 库(如果有)
│           ├── lib3.cpp          # DLL 库源代码
│           └── lib3.h            # DLL 库头文件
├── include/                      # 公共头文件目录
│   ├── lib1.h                    # 第一个 DLL 库的公共头文件(如果有)
│   └── lib2.h                    # 第二个 DLL 库的公共头文件(如果有)
├── lib/                          # 编译出来的 DLL 库文件目录
│   ├── lib1.dll                  # 第一个 DLL
│   ├── lib2.dll                  # 第二个 DLL
│   └── lib3.dll                  # 第三个 DLL
├── resources/                    # 资源文件目录(如图像、样式等)
│   └── logo.png                  # 资源文件示例
└── .vscode/                      # VS Code 配置文件└── settings.json             # VS Code 的个性化设置

CMake 配置

项目的构建依赖于 CMake,每个子项目(EXE 和 DLL)都有独立的 CMake 配置文件。接下来,我们来逐一讲解如何配置根目录和各个子项目的 CMakeLists.txt 文件。

1. 根目录的 CMakeLists.txt

在根目录下的 CMakeLists.txt 文件中,我们配置全局设置,包括查找 Qt 库、引入子目录等:

cmake_minimum_required(VERSION 3.10)project(MyProject)# 设置公共头文件目录
include_directories(include)# 查找 Qt 库
find_package(Qt5 REQUIRED Widgets)# 添加子目录
add_subdirectory(src/exe)
add_subdirectory(src/dlls)

在此文件中,我们设置了 公共头文件目录 (include/),并使用 find_package() 查找所需的 Qt 库。add_subdirectory() 则将 EXE 和 DLL 子项目引入进来。

2. EXE 项目的 CMakeLists.txt

接下来是 EXE 程序的 CMake 配置。EXE 程目依赖于多个 DLL 库和 Qt 库,所以需要在 CMakeLists.txt 文件中配置相应的源代码文件和链接库。

src/exe/CMakeLists.txt 示例:

# 设置 EXE 程序源代码
set(SOURCESmain.cppmainwindow.cpp
)# 创建可执行文件
add_executable(MyExe ${SOURCES})# 设置 EXE 项目包含头文件路径
target_include_directories(MyExe PRIVATE ${CMAKE_SOURCE_DIR}/include)# 链接 Qt 库
target_link_libraries(MyExe Qt5::Widgets)# 如果 EXE 需要链接 DLL 库
target_link_libraries(MyExelib1lib2
)

在此文件中:

  • set(SOURCES ...) 指定了 EXE 程序的源代码文件。
  • add_executable(MyExe ${SOURCES}) 创建了一个可执行文件。
  • target_include_directories() 用于设置 EXE 程序的头文件路径。
  • target_link_libraries() 用于链接 Qt 库和 DLL 库。
3. DLL 项目的 CMakeLists.txt

每个 DLL 库也有自己的 CMakeLists.txt 文件。以下是第一个 DLL 库 lib1 的配置文件示例:

src/dlls/lib1/CMakeLists.txt 示例:

# 设置 DLL 库源代码
set(SOURCESlib1.cpp
)# 创建共享库(DLL)
add_library(lib1 SHARED ${SOURCES})# 设置 DLL 库包含头文件路径
target_include_directories(lib1 PRIVATE ${CMAKE_SOURCE_DIR}/include)# 链接 Qt 库(如果需要)
target_link_libraries(lib1 Qt5::Widgets)

该文件的作用是:

  • 使用 add_library(lib1 SHARED ...) 创建 DLL 库。
  • 使用 target_include_directories() 来指定头文件路径。
  • 使用 target_link_libraries() 来链接 Qt 库(如果需要)。

你可以按照相同的方式为其他 DLL 库(如 lib2lib3)编写相应的 CMake 配置。

4. 公共头文件目录

公共的头文件存放在 include/ 目录下,例如 lib1.hlib2.h。为了确保 EXE 和 DLL 项目能够正确引用这些头文件,我们需要在 CMakeLists.txt 中配置头文件路径。

在根目录的 CMakeLists.txt 中,使用 include_directories(include) 来设置公共头文件目录。每个子项目则通过 target_include_directories() 来确保能够访问这些头文件。

编译与链接

  1. 编译 DLL:每个 DLL 库通过 add_library(lib1 SHARED ${SOURCES}) 创建,并生成 .dll 文件。编译后的 DLL 文件会存放在 lib/ 目录中。

  2. 编译 EXE:EXE 程序会通过 target_link_libraries() 来链接需要的 DLL 库,最终生成 EXE 文件并放在 build/ 目录中。

  3. 链接 Qt 库:所有项目(EXE 和 DLL 库)都需要链接 Qt 库,确保界面能够正常运行。

VS Code 配置

为了在 VS Code 中顺利开发,我们需要在 .vscode/ 目录下配置一些基本的设置。例如:

{"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools","CMake.configureOnOpen": true,"cmake.buildDirectory": "${workspaceFolder}/build"
}

这会确保 VS Code 使用 CMake 作为构建系统,并且在打开项目时自动配置和构建。

总结

通过这个方案,我们为一个包含 EXE 程序和多个 DLL 库的项目提供了清晰的结构。每个子项目都可以独立编译和链接,同时共享公共的头文件和库文件。这样的设计使得代码模块化、易于维护,并且便于扩展新的功能。对于使用 VS Code + CMake + Qt + GCC 环境的开发者,这种结构非常适用。

http://www.xdnf.cn/news/3726.html

相关文章:

  • Linux运维中常用的磁盘监控方式
  • # 前后端分离象棋对战项目开发记录
  • 安卓游戏APK文件解密与编辑的完整攻略
  • NVIDIA Performance Primitives (NPP) 库全面解析
  • string--OJ1
  • linux的信号量初识
  • Linux-06-磁盘分区类命令
  • 数字智慧方案6181丨智慧医院智慧后勤发展顶层设计及应用解决方案(42页PPT)(文末有下载方式)
  • 【言语理解】中心理解题目之结构分析
  • Laravel 12 实现 API 登录令牌认证
  • 贪心算法解决会议安排问题
  • 架构进阶:深入学习企业总体架构规划(Oracle 战略专家培训课件)【附全文阅读】
  • 初始化列表详解
  • 基于SpringBoot的同城宠物照看管理系统
  • stm32 hal库 SPI使用(二)硬件SPI的HAL库函数调用
  • 架构师面试(三十八):注册中心架构模式
  • 数字智慧方案6189丨智慧应急综合解决方案(46页PPT)(文末有下载方式)
  • Linux操作系统系统编程:x86-64架构下的系统调用
  • 数字智慧方案5872丨智慧交通解决方案(54页PPT)(文末有下载方式)
  • 13分区排烟 无法远程启动 12-1-4,排烟管道出口未连接室外
  • vmware虚拟机Linux系统( CentOS7)初始化没有选择Pinyin,无法输入中文(Linux系统输入中文)
  • 计算机网络——客户端/服务端,URI与URL的区别,以及TCP/IP核心机制全解析
  • 红鸟3D互动系统棋类源码一键部署教程(含多个打包版本与功能解构)
  • C++ 赋值运算符重载详解
  • 全局分割与实例分割技术对比:U-Net与Mask R-CNN
  • Python项目源码69:一键解析+csv保存通达信日线数据3.0
  • C++map和set
  • linux指令中的竖线(“|”)是干啥的?【含实例展示】
  • HTTP 状态码详解:用途与含义
  • QMK固件中LED指示灯与RGB灯详解指南