# 课前准备 | 搭建实验环境 你好,我是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,也可以是更新的版本。 2. 我们选择的编译器是GCC,最低要求是4.6或者4.8,推荐使用5.4或者更高的版本。 3. 使用虚拟机软件搭建环境最方便,完全“自主可控”,推荐使用免费的VirtualBox。 4. GitHub上有配套的示例代码和参考资料,可以下载后编译验证环境是否搭建成功。 那么,行动起来吧,下节课让我们在Linux上愉快地一起“玩耍”。 ![](https://static001.geekbang.org/resource/image/a1/42/a130365df3f983716977b2e816df7c42.jpg)