You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

136 lines
8.0 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 课前准备 | 搭建实验环境
你好我是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.4CentOS 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的构建工具b2Boost 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)