跟着EP学C++(2nd) 搭建编译环境

再简单不过的C++编译原理

当我们打了一份C++代码时,如果我们要运行它,就需要对它进行编译
编译的目的,就是要把C++的代码转化成可以直接运行的机器语言(在第一章中就已经介绍过了)
而另一方面,有一种叫做解释器的东西(C++也有解释器,但用得极少),它直接读取源代码并且执行(执行应该比运行更加准确)
好吧,我简单扯了一下解释器。
但是编译器是怎么编译的呢?
大体上分四步:

  1. 预处理:删除注释,执行程序中的#include,#define等预处理命令
  2. 汇编:将C++代码转化(编译)成汇编代码
  3. 生成目标文件:将汇编代码转化(汇编)为目标文件(目标文件就是二进制机器码)
  4. 链接:将之前编译得到的(几个)目标文件与库文件,运行时库文件链接起来,得到可运行的程序

搭建您的环境

在我们继续讲编译原理之前,您必须先搭建您的环境,才能更加方便的讲怎么实现这些编译步骤
(注:以下内容是给那些完全没学过编译型语言的人介绍的。如果您已经学过C和Pascal之类的编译型语言,这些应该都是您知道的)

IDE vs 编辑器+编译器

这一直是关于学习编程争议最大的问题之一。
IDE,即集成开发环境。它会包括编辑框以及一系列操作和工具。
这挺上去很高级,不是吗?是的,但是它太高级了。我们在讲到多文件的时候才会教大家使用IDE。我们现在推荐大家使用编辑器+编译器。
(之所以不使用IDE的一个重要原因是从根本上支持单文件的IDE几乎没有。有其实还是有的,例如Dev-C++。但是它太老了,有太长时间没有更新了)
(当然,如果你已经学过C语言之类,对编译机制已经十分了解了,当然可以使用IDE。好的IDE有很多,比如VS,QtCreator等等)

选择什么编辑器

你有两种选择:

  1. 使用系统自带的:记事本(for Windows),gedit(for Ubuntu)及其它
    这样的好处你可以少做很多事。但你相信我,记事本最好还是算了
  2. 用比较好的编辑器,例如VSCode,Vim,atom等等

在这里我们推荐大家使用VSCode。毕竟是新生编辑器中发展劲头最猛的一款编辑器,对吧?
(希望那些再习惯Vim不过的大佬们谅解,毕竟让初学者浪费太多时间在编辑器上一般不是一件好事)
VSCode安装地址:https://code.visualstudio.com/
这里写图片描述
如图,点击那个被红框框框起来小箭头,根据您的操作系统和32/64位选择您要下载的版本。注意,对于Windows和linux,32位版需要额外多点一下红色区域所示的地方”32 bit versions”。
对于Windows版本,选择Installer版即可。而linux版,对于Debian,Ubuntu等使用Debian包的选择.deb版,对于Red Hat,Fedora,SUSE等使用Red-Hat包的选择.rpm版。
最好选择Stable版(稳定版)
下载约48MB
安装都不需要我来教吧……
打开VSCode
这里写图片描述
点击左下角的齿轮,点击设置
用户设置中可以填设置的代码,例如

{
    "git.ignoreMissingGitWarning": true, //不再提示未安装Git
    "files.autoSave": "afterDelay", //设置自动保存方式为定时保存,默认间隔时间为1s
    //"editor.fontSize": 22, //设置字号为22(因为个人喜欢比较大的字),没有此项默认是14
    "editor.fontFamily": "Consolas", //Consolas是当之无愧的Windows下最好的编程字体,Ubuntu可以用Ubuntu Mono
    "editor.insertSpaces": false, //缩进使用制表符而不是空格
    "editor.wordWrap": "on", //正常折行
    //"editor.minimap.enabled": false, //是否使用缩略图。个人不习惯所以关了。默认是开的
    "editor.smoothScrolling": true, //滚动制作成动画,使其看上去更平滑
    //"workbench.colorTheme": "Visual Studio Light", //颜色主题。你可以选择自己喜欢的(注1)
    "files.autoGuessEncoding": true, //猜测文件编码。利弊皆有吧,在复制了别的电脑/平台的文件时会起作用
    "files.defaultLanguage": "cpp", //默认文件类型(后缀名),在现在你当然选cpp啦
    "files.encoding": "gbk", //默认文件编码。如果你要查看你的文件编码,见注2
    "explorer.sortOrder": "type", //VSCode内置资源管理器的文件排列顺序。同样可自选
    "terminal.integrated.cursorBlinking": true, //集成终端光标闪烁
    "terminal.integrated.cursorStyle": "line", //设置集成终端光标为I形光标。可自选
    "terminal.integrated.fontSize": 22, //集成终端字体大小
    "explorer.confirmDragAndDrop": false, //在内置资源管理器中拖拽移动文件无需确认
    "explorer.confirmDelete": false //在内置资源管理器中删除文件无需确认(可选)
}

注:

  1. 编辑设置(以workbench.colorTheme为例)
    这里写图片描述
    在上方的输入框中可以对所有设置进行搜索
    将光标移至某设置上时,在左侧会有一个笔的图标”编辑”,它会给你几种选择或者”复制到设置”
  2. 关于文件编码(这些可能会影响到之后你的控制台程序能否使用中文)
    在计算机中有许多种文件编码,用于将数值转换(映射)到字符。其中最全面而最通用的就是UTF-8(即默认设置值”utf8”)
    但Windows很喜欢搞事情。它偏偏不肯跟上时代潮流,导致文件编码仍然无法统一。个人曾经试过修改控制台的文件编码,但这太麻烦了。反其道而行之,还是依从它吧。
    按下Win+R,输入cmd(在Windows10下使用powershell更佳)并敲回车
    这里写图片描述
    在控制台的标题栏右键单击,选择属性。在弹出的窗口中点击选项,找到当前代码页的选项。
    下面有几种常见的代码页值与VSCode文件编码字符串的映射:
代码页值文件编码字符串
936“gbk”
65001“utf8”

(其实一般括号内最后的字符串改成小写就是对的)

再按下Ctrl+Shift+X
这里写图片描述
搜索C/C++和Chinese (Simplified) Language Pack for Visual Studio Code两个扩展包并安装
这里写图片描述
安装完后记得重新加载
按下Ctrl+N就可以新建一个文件了!

编译器

编译器我们选用g++——相信所有了解C++的人都不会对这个决定有任何异议
linux/Mac安装g++最简单了——绝大部分都已经安装过了,如果没有,进终端啊。
但Windows下就并不好弄——我们需要MinGW
在这里我们用msys2的MinGW(个人觉得挺好用的)
(注:对于linux/Mac用户,您可以在下面的您的第一个C++程序&编译原理(续)处重新加入我们)

  1. msys2官网:http://www.msys2.org/
  2. 根据您电脑是32/64位选择适合的版本
    这里写图片描述
  3. 然后就是安装了(免教)。记得记住您的安装目录
  4. 打开安装目录(之后可能简称作/msys),双击运行mingw32.exe(32位)或mingw64.exe(64位)
    这里写图片描述
  5. 输入四行命令:
    pacman -S mingw32/mingw-w64-i686-gcc
    pacman -S gdb
    pacman -S make
    exit
    这里写图片描述
  6. 在/msys下搜索文件g++.exe,gdb.exe和make.exe并记住它们的位置(应该是分别在/msys/mingw32(或mingw64)/bin和/msys/usr/bin)
  7. 返回桌面,右击”计算机”,再点”属性”
  8. 在弹出窗口左侧点击”高级系统设置”
    这里写图片描述
  9. 点击”环境变量”
    这里写图片描述
  10. 在上方的用户变量Path中将刚才三个文件的位置添加进去
    对于Windows10(Windows8我不清楚),只需找空行将文件位置填入即可
    对于Windows7即以下的,放在Path内容之后,用分号’;’与其它位置分开
  11. 一路”确定”以退出。
  12. 打开终端(Win+R+输入cmd+回车),输入命令:
    g++
    gdb -v
    make
    这里写图片描述
    如果结果与图中类似,则说明安装成功了!
    (如果此时您打开了VSCode,则需要将其关闭并重启)

您的第一个C++程序&编译原理(续)

哦,提醒一下linux和Mac用户,您现在可以加入我们了。
现在,打开VSCode。如果没有打开文件,则按下Ctrl+N创建新文件。
在编辑区中输入以下代码:
(注:对于完全没学过编程的人,推荐您自己一个一个字符的打。学过编程的复制也无所谓啦~~)
(长度约4个字符的空白是缩进,按下Tab键即可)

//HelloWorld.cpp
#include<iostream>
using namespace std;
int main(){
    cout<<"Hello,world!\n";
    return 0;
}

将文件保存到{用户目录}下,命名为HelloWorld.cpp
(注:因为写用户目录过于麻烦,以后用~代替。对于linux系统,~就是~。对于Windows系统,您应该也很容易找到:在桌面一般会有用户目录文件夹(您的用户名)的图标;还找不到可以直接看看是不是C:/User/{您的用户名})
在VSCode中按下Ctrl+`(就是主键盘’1’旁边的那个键)即可打开VSCode集成终端。
先检查终端中当前目录是不是用户目录
如果是,请在终端中输入:

g++ HelloWorld.cpp -o HelloWorld

如果没有任何输出,就代表你没有打错。
如果有的话……你重新复制一遍吧

HelloWorld      (for Windows)
./HelloWorld    (for linux)

如果你看到下面输出了一个一句”Hello,world!”那么说明你成功了!
这里写图片描述

更好的管理您的代码

我们这个系列会有大量的代码,把它们全都放在用户目录下不太妥当
所以我们可以把它们放在~/Coding/LearnC++(在学完本系列后您可能会有别的需求,所以在Coding下在建立一个文件夹比较妥当)
我们可以先把HelloWorld.cpp和HelloWorld.exe(或HelloWorld)剪切(移动)至~/Coding/LearnC++
然后,在VSCode中,按下组合快捷键(Ctrl+K,Ctrl+O)(依次按下即可),打开文件夹~/Coding/LearnC++
当你打开了文件夹后,再打开终端时,默认目录便是打开的目录

现在,我们可以继续编译原理了。

  1. 预处理:g++ -E HelloWorld.cpp >HelloWorld.i
    如果你被HelloWorld.i这个庞大的文件而吓到的话,你可以看看最后几行。这可以让你感到安心。前面都是文件iostream和被它#include的文件
  2. 汇编:g++ -S HelloWorld.i
    生成HelloWorld.s。如果你没学过汇编你肯定是看不懂的
  3. 生成目标文件:g++ -c HelloWorld.s
    生成HelloWorld.o。这已经是二进制文件了
  4. 链接:g++ HelloWorld.o -o HelloWorld
    生成HelloWorld.exe(或HelloWorld)。这就是可执行文件了。

而且在调用命令是似乎是可以”跳步”的。例如,你可以直接通过g++ HelloWorld.cpp -o HelloWorld来生成可执行文件HelloWorld.exe(linux用户请注意,以后在说一个可执行文件的名字时都会用Windows的格式——带上.exe,终端执行时也可能只写HelloWorld而没有./。实践时请自行改掉),也可以通过g++ -c HelloWorld.cpp直接生成目标文件HelloWorld.o。似乎还可以通过g++ -c HelloWorld.i从经过预处理的代码生成目标文件HelloWorld.o


下一篇,我们会逐行解释HelloWorld代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值