Blog22 使用CMake管理C++项目
在 Ubuntu 22.04 下使用 Visual Studio Code (VS Code) 创建一个新的 C++ 项目(如 MyProject
),你可以按照以下步骤进行。这个过程会包含创建项目目录、编写代码、配置 CMake 和 VS Code 相关的文件等。
完整的项目创建和配置步骤
步骤 1:创建项目目录结构
-
打开终端,创建项目文件夹
MyProject
:1
2mkdir ~/MyProject
cd ~/MyProject -
创建项目的基本目录结构:
1
mkdir src include build
src/
:存放源文件(.cpp
文件)。include/
:存放头文件(.h
文件)。build/
:存放编译过程中生成的文件。
-
创建一个
main.cpp
和头文件mylib.h
,以及一个源文件mylib.cpp
:1
touch src/main.cpp src/mylib.cpp include/mylib.h
步骤 2:编写代码
编辑 src/main.cpp
文件:
src/main.cpp
1 |
|
编辑 src/mylib.cpp
文件:
src/mylib.cpp
1 |
|
编辑 include/mylib.h
文件:
include/mylib.h
1 |
|
步骤 3:编写 CMakeLists.txt
在项目根目录下创建 CMakeLists.txt
文件:
1 | touch CMakeLists.txt |
然后编辑 CMakeLists.txt
文件,内容如下:
CMakeLists.txt
1 | cmake_minimum_required(VERSION 3.16) |
这个 CMake 配置文件做了以下工作:
- 设置项目名为
MyProject
。 - 设置 C++17 作为项目的编译标准。
- 指定头文件的目录为
include
。 - 列出项目中的源文件。
- 生成可执行文件
MyProject
。
步骤 4:在 VS Code 中打开项目
-
启动 VS Code,然后打开
MyProject
文件夹:1
code ~/MyProject
-
如果尚未安装
CMake Tools
插件,按Ctrl+Shift+X
搜索并安装CMake Tools
插件。 -
VS Code 会检测到
CMakeLists.txt
文件,并在左下角显示CMake
相关的选项。
步骤 5:配置 CMake 和编译项目
- 按
Ctrl+Shift+P
打开命令面板,输入并选择CMake: Configure
。- 第一次运行时,VS Code 会询问你选择哪种编译器。选择
GCC
或适合你的系统的编译器。
- 第一次运行时,VS Code 会询问你选择哪种编译器。选择
- 配置完成后,按
Ctrl+Shift+P
,选择CMake: Build
来编译项目。- 编译完成后,会在
build/
目录中生成可执行文件MyProject
。
- 编译完成后,会在
步骤 6:调试配置
-
进入
.vscode
文件夹,创建或编辑launch.json
文件:1
2mkdir .vscode
touch .vscode/launch.json -
编辑
launch.json
文件,内容如下:
.vscode/launch.json
1 | { |
program
字段指定要调试的可执行文件路径。preLaunchTask
设置为CMake: build
,表示在调试之前会先编译项目。
-
按
F5
启动调试,会编译并运行项目。你应该在终端中看到输出:1
2Hello, CMake Project!
This is a function from mylib.
步骤 7:手动编译和运行(可选)
如果你想在不使用 VS Code 内置的 CMake 配置的情况下编译,可以在终端中手动执行:
1 | cd ~/MyProject/build |
- 这将会在
build/
目录下生成Makefile
并编译MyProject
。 ./MyProject
将会运行生成的可执行文件。
总结
- 创建项目结构:
src
目录存放源文件,include
目录存放头文件,build
目录用于生成编译文件。 - 编写 CMakeLists.txt:用于定义项目的编译配置。
- 配置 VS Code 的 CMake Tools:自动化编译和调试过程。
- 调试配置(launch.json):为调试提供正确的路径和配置。
在实际的 C++ 项目开发过程中,尤其是涉及多个项目或者经常切换不同项目的情况,有一些配置文件是经常需要修改的。这些文件通常用于管理项目结构、编译选项、库的依赖等。以下是常见的配置文件以及它们的用途:
1. CMakeLists.txt
如果你使用 CMake 来管理项目,那么 CMakeLists.txt
是最需要修改的文件之一。它定义了项目的编译方式、包含的文件、依赖的库等。以下是一些经常需要修改的部分:
-
项目名称和版本:
1
project(MyProject VERSION 1.0)
在创建新项目或复制旧项目时,需要修改项目名称和版本。
-
源文件和头文件:
1
2
3
4set(SOURCES
src/main.cpp
src/mylib.cpp
)每当你添加或删除源文件时,
SOURCES
列表需要更新。 -
包含目录:
1
include_directories(include)
如果添加新的头文件目录(如新的模块或第三方库),需要在
include_directories
中进行更新。 -
编译选项:
如果项目有特殊的编译选项需求,例如启用某些编译器警告或调试选项,需要调整
CMakeLists.txt
中的编译选项:1
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -O2")
-
添加库依赖:
如果项目依赖于第三方库或者你自己编写的静态库或动态库:
1
target_link_libraries(MyProject PRIVATE MyLibrary)
每次添加或移除库时需要调整这里的配置。
2. launch.json
(VS Code 调试配置)
launch.json
是 VS Code 中用于调试的配置文件。每当你创建一个新项目或更改可执行文件的位置时,都需要更新这个文件。常见需要修改的部分包括:
-
程序路径:
1
"program": "${workspaceFolder}/build/MyProject"
如果项目名称改变,或者可执行文件位置改变,需要修改这个路径。
-
工作目录:
1
"cwd": "${workspaceFolder}"
如果工作目录发生变化(比如项目的根目录改变),则需要更新
cwd
字段。 -
调试前的编译任务:
如果更改了编译任务的名称,需要同步更新
preLaunchTask
:1
"preLaunchTask": "CMake: build"
3. tasks.json
(VS Code 编译配置)
tasks.json
是 VS Code 中用于配置编译任务的文件。在项目发生变化时,以下几项可能需要修改:
-
编译目标文件:
如果项目生成的可执行文件或输出文件名改变,需要修改
args
中的-o
参数:1
"args": ["-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}"]
-
编译器路径:
如果切换了不同版本的编译器,或者项目需要特定版本的编译器,可能需要修改
command
字段:1
"command": "/usr/bin/g++-10"
4. .gitignore
如果项目使用 Git 进行版本控制,.gitignore
文件也是经常需要修改的配置文件。它用于指定哪些文件或目录不应被 Git 追踪。常见的修改包括:
-
忽略编译生成的文件:
1
2build/
*.o每次更改项目的输出目录时,可能需要更新
.gitignore
文件。 -
忽略 VS Code 配置文件:
1
.vscode/
如果不希望将 VS Code 的配置提交到版本库,也可以在这里进行忽略。
5. 项目 README 和文档
在项目开发过程中,README.md
或其他项目文档也经常需要更新,特别是在项目结构或依赖发生变化时。需要修改的内容包括:
-
项目描述:当项目功能有较大变化时,需要更新描述。
-
编译和运行指南:例如,使用
cmake
进行构建的命令步骤:1
2
3
4
5mkdir build
cd build
cmake ..
make
./MyProject -
依赖列表:当添加或移除依赖时,需要更新这些依赖的安装步骤或说明。
6. settings.json
(VS Code 配置)
settings.json
文件是 VS Code 的用户设置或工作区设置文件。在项目切换时,可能需要调整一些特定的配置:
-
代码格式化工具:如
clang-format
的路径。1
"C_Cpp.clang_format_path": "/usr/local/bin/clang-format"
-
特定项目的编译配置:如果某些项目有特殊的 include 路径,可以在
settings.json
中进行设置:1
"C_Cpp.includePath": ["${workspaceFolder}/include", "/usr/local/include"]
总结
在多项目开发过程中,以下是经常需要修改的配置文件:
- CMakeLists.txt:管理项目构建和编译,调整源文件、库依赖、头文件目录等。
- launch.json 和 tasks.json:VS Code 中的编译和调试配置,调整项目路径和调试选项。
- .gitignore:忽略不需要追踪的文件。
- README.md:更新项目描述、依赖和使用方法。
- settings.json:VS Code 的用户配置,设置与项目相关的编辑器行为。