完整的 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 库(如 lib2
和 lib3
)编写相应的 CMake 配置。
4. 公共头文件目录
公共的头文件存放在 include/
目录下,例如 lib1.h
和 lib2.h
。为了确保 EXE 和 DLL 项目能够正确引用这些头文件,我们需要在 CMakeLists.txt
中配置头文件路径。
在根目录的 CMakeLists.txt
中,使用 include_directories(include)
来设置公共头文件目录。每个子项目则通过 target_include_directories()
来确保能够访问这些头文件。
编译与链接
-
编译 DLL:每个 DLL 库通过
add_library(lib1 SHARED ${SOURCES})
创建,并生成.dll
文件。编译后的 DLL 文件会存放在lib/
目录中。 -
编译 EXE:EXE 程序会通过
target_link_libraries()
来链接需要的 DLL 库,最终生成 EXE 文件并放在build/
目录中。 -
链接 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 环境的开发者,这种结构非常适用。