<audio id="audio" title="课前准备 | 搭建实验环境" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/24/e9/247d3663da06a7e26bc4befd800c65e9.mp3"></audio>

你好，我是Chrono。

在开始正式的学习之前，我们需要先做一点准备工作——在自己的电脑上搭建出课程使用的实验环境。

我会给你推荐具体的操作系统、编译器，带你一步步搭建环境，还会给你分享我的[GitHub链接](https://github.com/chronolaw/cpp_study)，之后课程里的所有代码，你都可以在这里找到。

## 操作系统

首先说一下操作系统。

目前流行的操作系统有三种：Windows、macOS和Linux。

Windows是应用得最广泛的一个系统了，是绝对的主流，但是，作为C++开发环境来说，Windows并不能算是首选。

一个原因是，Windows上的标准C++开发工具Visual Studio不是免费的，尽管它提供了可自由下载的社区版，但有各种限制（你可以看下社区版和其他版本的[差异](https://visualstudio.microsoft.com/zh-hans/vs/compare/)），用来做实验还行，如果要用来开发正式的软件，就不是那么合适了。

另一个更重要的原因是，Windows现在已经不再是C++的“主战场”了，现在开发Windows程序，更多的是用C#、Java、TypeScript等其他语言，在Windows上写C++程序，很难有大的作为，会有种“英雄无用武之地”的感觉。

macOS是苹果的专用系统，比较“小众精英”，用户比较少。必须要承认，它是一个很高效易用的开发环境，但也有点“曲高和寡”，不是每个人都能有一台MacBook的。而且，macOS虽然也是UNIX，但它源自FreeBSD，内部结构、使用方式与Linux有一些差异。

macOS也有与Windows相同的问题，它的官方开发语言是Objective-C、Swift，几乎没有纯粹使用C++开发出的Mac应用。

所以，**我建议你使用Linux操作系统**，它是完全自由、免费的系统，不受任何人的控制，开发工具链非常完善，而且，目前差不多所有的商业网站的服务器（当然还有Android）上跑的都是Linux，而C++也正好能在开发后台应用服务方面大显身手，两者可谓是“绝配”。

## 编译器

选好了Linux操作系统，接下来就要选择编译器了。

虽然C++20马上就要发布了，但现在C++标准的实际普及情况还是相当落后的。据我多年的观察，很多企业因为各式各样的原因，还在用着老旧的操作系统和编译器，别说C++20了，连C++17都很少用到。

所以，从应用现状出发，我不会使用那么“超前”的标准和编译器，而是选择更贴合实际、更“接地气”的编译器，让你在工作中能够立即用得上，不用苦等操作系统、编译器的升级。

好了，说一下我对编译器的要求：**至少要支持C++11，支持到C++14最好，对再往上的17/20则不强求，在今后的课程中，也会尽量不涉及17/20里的特性**。

把这几点要求落实到Linux上的默认编译器GCC，就是4.6或者是 4.8版本，越高越好。至于具体版本GCC对C++的支持程度，可以在它的[官网](https://gcc.gnu.org/projects/cxx-status.html)上找到。

GCC通常是和Linux系统绑定在一起的，选编译器也就相当于选择Linux的版本。

Linux也是版本众多，最常见的是**RedHat系的CentOS**和**Debian系的Ubuntu**。

这两个被很多企业广泛采用，但CentOS通常比较“稳定”，更新较慢，像CentOS 6一直用的是GCC 4.4，CentOS 7也才是4.8，对C++标准的支持很不完善，极大地限制了C++能力的发挥。

所以，**我建议使用的Linux操作系统是Ubuntu，最低版本是16.04**。这个系统里的GCC版本是5.4，完美支持C++11/14。当然，你要是愿意安装更新的18.04、20.04也没有问题，它们里面的GCC版本更高，支持C++17，只不过有点“功能过剩”。

## 搭建环境

确定了操作系统和编译器以后，该去哪里找一个这样的开发环境呢？

你的公司里或许就有现成的Linux服务器，可以直接登录上去用，但公司服务器的环境不一定满足刚才说的那几点要求，而且还得小心，别把系统搞乱了，所以，还是弄一个自己的实验环境最保险。

好在如今的虚拟技术非常成熟，只要安装一个虚拟机软件，再去Ubuntu官网下载一个光盘镜像，然后按部就班地点点鼠标就行了。

这里我选择的是免费的VirtualBox，版本任意，Ubuntu则是[64位的桌面版](http://releases.ubuntu.com/16.04/ubuntu-16.04.6-desktop-amd64.iso)。至于它们俩具体的安装过程，网上有很多资料，而且我相信，即使没有资料，也难不倒你，所以我就不再多说了。

弄好VirtualBox和Ubuntu环境之后，还有一个小小的“收尾”步骤。

Linux系统里通常默认只有GCC，没有G++，所以还要再执行一个apt-get命令：

```
sudo apt-get install g++

```

安装完成后，在命令行里敲一下“g++”命令，看一下它的版本号是否满足我们的要求：

```
g++ --version

g++ (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.

```

## GitHub项目

和之前的[《透视HTTP协议》](https://time.geekbang.org/column/intro/100029001)一样，我也在GitHub上为这个课程建立了一个项目：[cpp_study](https://github.com/chronolaw/cpp_study)，里面有很多示例代码和有用的资料链接，你可以在Linux环境里用“git clone”下载。

不过，说起来不怕你笑话，我写了二十来年的C++程序，但一直不怎么会写Makefile。都说写Makefile是C++程序员的“基本功”，但我在这方面的确是“缺失”了，有点惭愧啊。

最早，我用的是Windows+VC自带的工程文件；后来转到Linux开发，用的是Boost的构建工具b2（Boost Build v2），写的是jamfile；再后来又定制开发Nginx，用的是Nginx自成体系的Shell config。

你看，这么多年来我就基本没正经写过Makefile，而且也没怎么用过其他的构建工具，比如cmake、scons。

所以呢，在这个GitHub项目里，我也就没有办法提供专门的Makefile，只能麻烦你在命令行上手动敲GCC的编译命令了。好在示例代码都很短很小，没有复杂的依赖关系，简简单单就能搞定，比如：

```
g++ xxx.cpp -std=c++14 -o a.out

```

这里需要注意的是参数“**-std=c++14**”，它告诉编译器，在处理C++代码的时候使用C++14标准，而不是11/17/20。

手敲命令还是挺麻烦的，所以，我在源码文件里还用注释的形式给出了编译命令，你可以直接拷贝粘贴使用，希望能够给你带来一点点的方便。

```
// Copyright (c) 2020 by Chrono
//
// g++ test.cpp -std=c++11 -o a.out;./a.out
// g++ test.cpp -std=c++14 -o a.out;./a.out
// g++ test.cpp -std=c++14 -I../common -o a.out;./a.out

```

在目录“section0”里，有一个最基本的示例程序，如果你能够正确地编译并运行，就说明实验环境搭建成功了。

在我的虚拟机里，这个程序的输出是（使用-std=c++14）：

```
c++ version = 201402
gcc version = 5.4.0 20160609
gcc major = 5
gcc minor = 4
gcc patch = 0
libstdc++ = 20160609

```

显示使用的是C++14标准，GCC版本是5.4.0，标准库版本是20160609。

当然，如果你是写Makefile的高手，欢迎你给这个项目提Pull Request，让其他同学都能用make来轻松地编译代码。

## 小结

作为正式开课前的“热身工作”，今天我介绍了课程使用的实验环境，简单小结一下：

1. 我们选择的操作系统是Linux，具体是Ubuntu 16.04，也可以是更新的版本。
1. 我们选择的编译器是GCC，最低要求是4.6或者4.8，推荐使用5.4或者更高的版本。
1. 使用虚拟机软件搭建环境最方便，完全“自主可控”，推荐使用免费的VirtualBox。
1. GitHub上有配套的示例代码和参考资料，可以下载后编译验证环境是否搭建成功。

那么，行动起来吧，下节课让我们在Linux上愉快地一起“玩耍”。

<img src="https://static001.geekbang.org/resource/image/a1/42/a130365df3f983716977b2e816df7c42.jpg" alt="">
