第 1 节

C++开发环境搭建与测试

这一章先不改代码,只做一件很具体的事:

在 Linux 上把我准备好的 CMake 模板跑起来。

如果你刚开始学 C++,看到 CMakeNinjatarget_link_libraries 这些名字不用紧张。本章不要求你理解它们的全部原理,先照着步骤把工程跑通。等后面学到头文件、分文件编写、第三方库时,再回来看这些内容会更自然。

完整 CMake 模板详解放在后面的 CMake工程模板。本章只关心两件事:

  1. 你的电脑能不能编译并运行 C++ 工程。
  2. VSCode 能不能用 F5 调试这个工程。

本章最终效果

做完本章后,你会得到一个名为 hello_cpp 的文件夹,里面是完整的 CMake 模板工程。

原样运行模板时,输出类似:

[lib1] Vector v = 1 2 3
[lib1] Norm = 3.74166
[lib2] Matrix m =
1 2
3 4
[lib2] Determinant = -2

这一章会按下面的顺序来:

  1. 在 Ubuntu 或 Fedora 上安装 C++ 开发工具。
  2. 下载我准备好的 CMake 模板。
  3. 先原样运行模板,确认环境没问题。
  4. 看一下模板里哪些文件和后面的学习有关。
  5. 用 VSCode 按 F5 调试模板程序。

先认识几个名字,后面看到它们就不会太突然:

名字先这样理解
g++真正编译 C++ 代码的编译器
CMake读取 CMakeLists.txt,生成构建规则
Ninja按照 CMake 生成的规则执行编译
GDB调试器,VSCode 按 F5 时会用到
lib1 / lib2模板里自带的两个示例小库,本章先不改它们
cmake_template模板当前生成的可执行程序名

注意:hello_cpp 是我们 clone 下来的文件夹名,cmake_template 是这个工程当前生成的程序名。它们不是一回事。

安装基础工具

Ubuntu / Debian

sudo apt update
sudo apt install git cmake ninja-build gcc g++ gdb libeigen3-dev

这里安装了 libeigen3-dev,是因为模板原始示例里用到了 Eigen。先装上它,模板就能直接跑起来。

Fedora

sudo dnf install git cmake ninja-build gcc gcc-c++ gdb eigen3-devel
Ubuntu/DebianFedora/RHEL说明
gitgit版本控制工具
cmakecmakeCMake 构建工具
ninja-buildninja-buildNinja 构建工具
gccgccC 编译器
g++gcc-c++C++ 编译器
gdbgdbGNU 调试器
libeigen3-deveigen3-develEigen3 C++ 数值库开发文件

检查工具是否安装成功

git --version
cmake --version
ninja --version
g++ --version
gdb --version

这些命令都能输出版本号,就说明基础环境已经可用。

安装VScode

https://code.visualstudio.com/Download

如果是debian系下载deb,如果是rhel系下载rpm.

下载完之后,点击浏览器,找到这个安装包的文件夹,并在该路径打开终端。

Debian系:输入sudo apt install ./code然后按tab按键补齐文件名,回车。

RHEL系:输入sudo dnf install ./code然后按tab按键补齐文件名,回车。

例如补齐后的:

sudo dnf install ./code-1.102.1-1752598767.el8.x86_64.rpm

配置VScode

然后打开VScode,在终端输入下面的命令

code

然后可以配置一个环境单独给C++环境使用,避免和默认环境冲突。

alt text

进行一些设置,按我的来就可以

alt text

选中你创建的CMake配置

alt text

安装 VSCode 扩展

建议在 VSCode 里安装这些扩展:

  1. CMake Tools
  2. C/C++
  3. C/C++ DevTools
  4. clangd

它们的分工是:

扩展作用
CMake Tools识别 CMakePresets.json,执行 configure/build,选择 target,管理 CMake 工程构建流程
C/C++微软官方 C/C++ 扩展,提供基础 IntelliSense、断点调试、GDB/LLDB 调试配置支持
C/C++ DevToolsC/C++ 扩展的辅助工具,提供更方便的调试信息展示、内存/寄存器/变量查看等增强能力
clangd基于 compile_commands.json 提供更准确的代码补全、跳转定义、查找引用、诊断提示、重构能力

简单说:

  • CMake Tools 负责构建工程;
  • C/C++C/C++ DevTools 主要负责调试;
  • clangd 主要负责代码提示、跳转、诊断和重构。

如果你使用 clangd 做代码提示,建议关闭或弱化 C/C++ 扩展的 IntelliSense,避免两个语言服务器同时工作导致提示重复或冲突。

alt text

clone CMake 模板

git clone https://github.com/tungchiahui/CMake_Template.git hello_cpp
cd hello_cpp
code .

这里把项目目录命名为 hello_cpp。后面所有命令都默认在这个目录里执行。

刚开始学习时先不要管 Git 历史,也不要急着改很多文件。第一步只做一件事:确认这个模板能在你的电脑上运行。

选中你创建的CMake配置

alt text

先原样跑通模板

用命令行方式运行

先不要急着改代码。按ctrl + ~弹出VScode终端并运行下面三行命令:

cmake --preset linux-debug
cmake --build --preset linux-debug
./build/linux-debug/src/cmake_template

如果输出类似:

[lib1] Vector v = 1 2 3
[lib1] Norm = 3.74166
[lib2] Matrix m =
1 2
3 4
[lib2] Determinant = -2

alt text

说明工程、编译器、CMake、Ninja、Eigen 都工作正常。到这里,最麻烦的环境部分就已经过关了。

注意:日常开发时可以直接运行 build 目录里的程序,不需要每次 install。

只有在验证安装布局时,才需要:

cmake --install build/linux-debug
./install/linux-debug/bin/cmake_template

出现以下,即成功!

[lib1] Vector v = 1 2 3
[lib1] Norm = 3.74166
[lib2] Matrix m =
1 2
3 4
[lib2] Determinant = -2

alt text

用VScode图形化方式运行

我们要用VScode图形化方式去运行上面那些命令:

点击左侧边的CMake:

  1. 首先要配置cmake --preset linux-debug,等同于在界面中是点击Configure按钮,并选择Linux Debug:
    alt text
  2. 然后cmake --build --preset linux-debug这个配置会在你配置configure时被自动配置:
    alt text
    然后你要手动点击左下角的Build按钮来进行build:
    alt text
  3. 然后./build/linux-debug/src/cmake_template运行这个程序等同于:
    先配置程序路径: alt text
    运行程序: Debug是对程序进行debug,而Launch是直接运行程序不debug,除非你有debug需求,一般咱们直接用launch. alt text
    alt text
    除了上面的操作入口,VSCode 底部状态栏中,Build 按钮旁边也有 DebugLaunch 快捷按钮。选择好 cmake_template target 并完成构建后,可以直接点击这里运行或调试程序。
    alt text

接下来是要讲如何把生成产物放进install,一般只有你要发行一个程序之类的才install,平常只用上面的build即可(测试完改回build的配置).

  1. cmake --install build/linux-debug等同于: 在 VSCode 里按 Ctrl+Shift+P,然后输入CMake: Install.
    alt text
    解释: 这个命令会调用当前配置的 build preset 对应的 cmake --install <buildDir>。 如果你选择了 linux-debug preset,它等同于cmake --install build/linux-debug.
  2. 然后./install/linux-debug/bin/cmake_template运行这个程序等同于: 先配置程序路径:
    alt text
    运行程序的方式和上面一样,也是点Debug或者Launch.

模板当前结构

现在看一下模板里和本章有关的文件。先不用理解每个 CMake 选项,只要知道 src/ 下面放的是代码:

.
├── CMakeLists.txt
├── CMakePresets.json
├── .vscode/
│   └── launch.json
├── cmake/
│   └── ProjectOptions.cmake
└── src/
    ├── CMakeLists.txt
    ├── main.cpp
    ├── lib1/
    │   ├── CMakeLists.txt
    │   ├── inc/lib1/eigen3_test.hpp
    │   └── src/eigen3_test.cpp
    └── lib2/
        ├── CMakeLists.txt
        ├── inc/lib2/eigen3_test.hpp
        └── src/eigen3_test.cpp

这里最重要的是:

位置作用
src/main.cpp程序入口,运行时从这里开始
src/lib1/第一个示例小库
src/lib2/第二个示例小库
CMakeLists.txt告诉 CMake 这个工程怎么构建

本章只需要认识这些位置,不需要修改它们。

常见问题

找不到 Ninja

报错类似:

CMake was unable to find a build program corresponding to "Ninja"

安装:

sudo apt install ninja-build

或:

sudo dnf install ninja-build

找不到 gdb

调试时如果找不到 GDB:

sudo apt install gdb

或:

sudo dnf install gdb

改了 CMakeLists.txt 后构建异常

本章没有要求修改 CMakeLists.txt。如果你后面章节改了 CMake 文件后构建异常,可以重新 configure:

cmake --fresh --preset linux-debug

或者删除构建目录:

rm -rf build/linux-debug
cmake --preset linux-debug

下一步学什么

本章只是让你先拥有一个能运行、能调试的小工程。

后面的章节会从 C++ 基础语法开始讲:

  1. C++ 基础初识
  2. 数据类型与数据存放
  3. 输入输出
  4. 运算符
  5. 程序流程结构

下一章开始,我们先只改 src/main.cpp。等你学到函数分文件编写时,再去整理 lib1 / lib2;等你学到工程组织、第三方库和构建系统时,再回来看 CMake工程模板