vlambda博客
学习文章列表

VScode配置C/C++运行环境!长文预警!

1.引言

2021

所谓“工欲善其事,必先利其器”,一款好的编程工具可以带来完全不同的体验。然而据我观察,在初学C或C++的时候,老师们推荐的工具大多是Codeblocks,Dev c++甚至VC++。


Codeblocks的特点是无需安装mingw,部分智能提示。而后两款都需要配置mingw,但是代码完全没有自动提示。这些工具都隐藏了编译运行的过程,直接通过一个按钮即可运行程序。对于初学者来说确实可以暂时忽略这些,但是很多人在有一定编程基础后,依然沿用了这些工具,这个时候就不是很恰当了。比如利用强大的调试去分析程序,而不仅仅是只会printf。


估计很多人都听过VScode的大名,也有很多同学尝试去配置C/C++环境,但失败的大有人在。包括我自己,第一次配置的时候也是死去活来的,好不容易搞好帮别人配置又死去活来,怀疑人生。失败的原因,我认为主要有两点:一是用多了一键运行,不明白一个程序从编写好到输出结果经历了哪些过程;二是网上教程太过杂乱,复制粘贴的较多,最关键的是大多也只是填鸭式的灌输,仿照的时候让人感觉稀里糊涂的,不明所以。


这篇文章将会详细介绍一个程序从编写到输出结果所经历的过程,并据此详细介绍如何利用VScode配置C/C++环境。在仿照配置的时候,不应该只是满足于配置结果,应该及时结合前文的程序执行过程理解,遇到不对劲的问题也可以根据原理自己思考,尝试解决。相信配置完成后,你对程序的理解会更近一步。

2.程序执行过程

VScode配置C/C++运行环境!长文预警!
#include<stdio.h>int main(){  printf("hello, world!\n");  return 0;}

hello.c

这段代码相信很多同学都不陌生,简直是刻入灵魂的记忆。那么这段代码是如何被计算机识别,并最终在屏幕上输出hello,world的呢,不少同学还是不了解的。然而这段过程又如此重要,对于任何一个想要写出高性能代码的程序员来说,这是最基础的一步。接下来我将会以易于理解的方式讲述这个过程,适合零基础阅读。(限于本人能力,文章中难免出现错误,欢迎大家指正!)


首先需要明确一点,计算机内部的程序活动最终都是一段段二进制码构成的,这些二进制码经过精心的设计,使得它们代表了不同的含义,中央处理器(CPU)根据这些二进制码代表的含义进行相应的操作。CPU操作的结果要么反应在计算机内部,要么反应在硬件设备上,因此才形成了我们可看到的屏幕变化。那些不断被CPU执行的二进制代码串,就是我们熟悉的机器码。


也就是说,想要利用计算机做点事情,只需要编写这些二进制代码段可以啦。在早期的编程的确是这样的,然而很快工程师们发现,这样编写程序的效率是非常低下的,而且极易犯错,毕竟当一大段全是01串摆在面前,令谁都会头疼。这群聪明的工程师们就想了一些办法,因为英文单词是比较好辨别的,所以他们就设计了一整套逻辑自洽的符号系统,每个单词底层都对应着一段01串,代表相应的含义。这就是汇编码。


由上面的解释很容易看出,汇编码其实就是对二进制码做了一个翻译,让汇编码变得对人类可读,而机器码依然对计算机可读。汇编程序的目的就是审查汇编码并将其转化为机器码。


看起来似乎只需要利用汇编码进行编程开发就可以了,然而事实并非如此。计算机归根结底是研究如何在有限的内存空间中,在有限的时间里解决问题。所以汇编码很多是对寄存器、内存等等的直接操作,这些细节是有可能通过一些方法对工程师屏蔽的。于是,高级语言就出现了。


现在我们通常见到过的,比如C/C++,Java,Python等等语言,都是高级语言,它们的编译系统(编译器/虚拟机/解释器等)的目的就是为了将写好的高级语言代码编译成汇编码,所以无论什么语言,只要是实现同一个功能,最终形成的汇编码是一致的。而对于采用相同指令集架构(可以理解为汇编码的设计一样)的计算机来说,不论高级语言在哪台计算机上运行,所产生的结果都是一样的,因为它们的汇编码是一样的,方便移植。


——请认真阅读上面文字再继续下面内容——


接下来,我们就来看看hello.c文件执行时经过哪些过程吧。

VScode配置C/C++运行环境!长文预警!

一般来说,执行hell.c程序经历了四个阶段,分别是预处理阶段、编译阶段、汇编阶段和链接阶段。


预处理阶段:预处理器根据hello.c文件中以#开头的命令,修改原始C程序,将头文件内容直接插入到程序文本中,生成一个hello.i文件。


(插个题外话,现在有部分同学应该可以理解,为什么在初次写CPP的头文件时,经常会加上#ifndef,#define,#endif类似的语句了,这是为了防止重复插入头文件内容,避免全局变量的重复定义或者函数的重复定义)


编译阶段:编译器将文本hello.i翻译成文本文件hello.s,这是一段汇编码。


汇编阶段:汇编器将汇编码文件hello.s翻译为机器码指令,并将这些机器码指令打包成可重定向目标程序hello.o,这是一个二进制文件。


链接阶段:hello程序调用了printf函数,在C语言中printf函数存在于已经预先编译过的printf.o目标文件中,因此需要将hello.o与printf.o两个目标文件链接起来,才能得到一个可执行文件(win中是exe)。可执行的意思可以加载到内存中由系统执行。

3.VScode配置C/C++环境

VScode配置C/C++运行环境!长文预警!

首先为什么会有这个教程?最最最最主要的原因是网上关于这方面的配置大多数是复制粘贴的,大部分都是让人感觉云里雾里。作为一位vscode忠实爱好者,怎么能允许这样的事情发生呢?


当然其中不乏有些内容全面的文章,但有些太全了,各种参数介绍的满满的。这样也不好,很容易造成信息轰炸效应,降低积极性。


其实我们仔细想想,配置的最主要目的其实就是为了能运行成功一个程序,其他的各种设置是次要的。这就像搭积木,先把底层搭建好,搭牢固,之后的都是可以慢慢来的。

3.1 安装


网站大致长这样:

VScode配置C/C++运行环境!长文预警!

注意,往下翻,我们选择后缀名为exe的程序:

VScode配置C/C++运行环境!长文预警!

需要记住安装的目录路径,比如我这里是将其安装在F:\MinGW下。接下来将F: \ MinGW \ mingw64 \ bin目录添加在系统环境变量中。

VScode配置C/C++运行环境!长文预警!
VScode配置C/C++运行环境!长文预警!
VScode配置C/C++运行环境!长文预警!

最终添加:

VScode配置C/C++运行环境!长文预警!

验证是否成功添加到系统环境变量中,只需要打开cmd命令行查看版本。

win+R:

VScode配置C/C++运行环境!长文预警!

输入g++ -v:

VScode配置C/C++运行环境!长文预警!

显示一大段内容,说明成功了!

之后安装vscode和插件:


接下来只需要安装以下三个插件就可以了:

VScode配置C/C++运行环境!长文预警!
VScode配置C/C++运行环境!长文预警!

3.2 配置文件

我们先写一个简单的程序:

(建议在某个地方专门建立一个c++文件夹,然后用vscode打开这个文件夹,进行配置。这样做,配置成功后,之后想写CPP程序,只需要在这个文件夹下就可以,不需要重新配置了。)

VScode配置C/C++运行环境!长文预警!
VScode配置C/C++运行环境!长文预警!

可以看到红色波浪线,说明此时的程序中存在错误,是无法运行的。


联想一下程序执行经历的阶段,可知此时只是一个文本文件hello.cpp,要进入到下一阶段,我们需要一个编译器。还记得我们安装的插件C/C++吗?它就是用来帮助我们设置编译器的。


1. 如何使用它呢?按住ctrl+shift+p,输入C/C++,选择"Edit Configurations(UI)"【编辑配置(UI)】,进入配置。

VScode配置C/C++运行环境!长文预警!

需要配置两项内容。一个是编译器路径。我这里因为安装时在F:\MinGW,其bin目录就在F:\MinGW\mingw64\bin,那么其编译器就s是F:\MinGW\mingw64\bin\g++.exe

VScode配置C/C++运行环境!长文预警!

第二是IntelliSense模式,设置为gcc x64

VScode配置C/C++运行环境!长文预警!

2. 配置构建任务


有了编译器之后,还需要开启一个编译进程,用来使用g++编译器生成exe文件。这就是构建任务了。


按住ctrl+shift+p,输入tasks,选择"Tasks : Configure Default Build Task"【任务:配置默认生成任务】。如下图

VScode配置C/C++运行环境!长文预警!
VScode配置C/C++运行环境!长文预警!

由此,得到一个配置文件tasks.json

VScode配置C/C++运行环境!长文预警!

至此,大部分同学应该可以毫无错误的到达。然而此时程序依然是无法运行成功的。在vscode上方找到运行,然后启动调试后,会发现还需要配置一个launch.json,这个文件至关重要,在第一次启动调试失败后,便会生成。让我们打开这个文件,看看里面到底设置了哪些参数。

启动调试后的选择:

VScode配置C/C++运行环境!长文预警!
VScode配置C/C++运行环境!长文预警!

launch.json文件

VScode配置C/C++运行环境!长文预警!

查看两个参数:program可以设置为和图片上一致。miDebuggerPath参数要设置为安装目录文件的bin目录下的gdb.exe,这是调试工具,功能非常强大。


如果此时启动调试,大概率还是会失败,总是会显示文件未找到。这是因为这里还需要添加设置一个参数,preLaunchTask。没找到的文件是exe可执行文件,然而程序一开始是先运用了launch.json的配置项,而生成exe是需要用到tasks的。也就是说,在exe文件还没来得及生成,launch就被启动了,这当然就会显示文件不存在。


解决的方法也很简单,只需要调整它们之间的顺序就可以了。preLaunchTask即代表了需要在launch之前调用tasks,识别task只需要设置tasks.json中的label。


tasks.json

VScode配置C/C++运行环境!长文预警!

launch.json

VScode配置C/C++运行环境!长文预警!

最后,启动调试,成功!

4.结语

文章图文有点长,希望小伙伴们耐心看完,有疑问可以留言。这是我第一次写技术类文章,可能会有一些不合理甚至错误的地方,希望大家可以指正,一起进步。任何的建议,我也会积极采纳。


其实写这篇文章,耽搁了很久,一直懒的不来写,觉得麻烦,自己配置起来也就分分钟。但我还是想,虽然简单,但却值得。特别是加入了程序执行阶段的讲述,这也是在面试中也是会被经常问到的点,提前了解一点也没什么不好。这篇文章就是针对计算机小白的,大佬们可能看不上,但每个大佬,都曾经小白过。


最后,祝大家都能配置成功,把vscode玩转起来!