linux下VscodeC++环境配置

首先要感谢的是这位大神:https://blog.csdn.net/lwwl12/article/details/78189382 看了他的文章之后,我恍然大悟

一.

回到主题,在了解两个json文件之前,我们先看一下g++是如何工作的:

0.通过> g++ --version 查看是否安装了g++,如果没有安装,请自行安装

1.随便找一个文件夹,我们先写一个Main.cpp

1 #include<iostream>
2 
3 int main(void){
4     std::cout<<"Hello Linux!"<<std::endl;
5     return 1;
6 }

2.在当前文件夹下打开终端,输入> g++ -g -c Main.cpp 后,当前文件空间下会出现 Main.o

3.在终端中继续输入 g++ -o Main.out Main.o 后,文件空间下将会出现 Main.out(可执行文件)

4.在终端中输入 ./Main.out 即可执行

关于g++的基本用法,可以参考一下(这位大神的文章:https://blog.csdn.net/xuliqiang101010/article/details/53731042),其实也很简单就是一个编译与链接的过程, -c只编译生成目标文件并没有形成可执行文件, -o 编译加链接直接生成了可执行文件 .out,所以上面的命令也可以简化为: g++ -o Main.out Main.cpp

 

二.

0.其实Lauch.json负责的是执行文件(可执行文件),task.json负责的是编译链接生成可执行文件,所以二者是想匹配的. 另外VScode相关的C++插件请自行下载

1.进入VScode,打开刚才Main.cpp所在的文件夹空间(可以删除那些 .o 或 .out 文件)

2.我们按F5进行调试,出现调试环境选择

3.选择C++(GDB/LLDB)环境后,出现了许多调试任务的模板,我们选择最后一个 '默认配置' 选项,然后开始配置Launch.json

 1 {
 2     // 使用 IntelliSense 了解相关属性。 
 3     // 悬停以查看现有属性的描述。
 4     // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
 5     "version": "0.2.0",
 6     "configurations": [
 7         {
 8             "name": "(gdb) Launch", //Name 无关紧要
 9             "type": "cppdbg",       //不可修改
10             "request": "launch",    //请求的方式,这里下面的文章会详细说明
11             //"program": "${workspaceFolder}/a.out",  //解释一下, ${workspaceFolder}是当前文件空间的相对路径 a.out是目标文件
12                                                       //a.out我们完全可以修改,我们就修改成 ${fileBasenameNoExtension}.out
13 
14             "program": "${workspaceFolder}/${fileBasenameNoExtension}.out",
15                                                       //至于 workspaceFolder fileBasenameNoExtension见名思意
16                                                       //另外关于.json中的各种替换变量的意思详见下面这位大神的文章:
17                                                       //https://blog.csdn.net/bat67/article/details/78302870                                           
18             "args": [],
19             "stopAtEntry": false,
20             "cwd": "${workspaceFolder}",
21             "environment": [],
22             "externalConsole": false,
23             "MIMode": "gdb",
24             "setupCommands": [
25                 {
26                     "description": "Enable pretty-printing for gdb",
27                     "text": "-enable-pretty-printing",
28                     "ignoreFailures": true
29                 }
30             ],
31                        
32             "preLaunchTask": "Hello"    //默认不会生成,但是非常重要,因为Launch.json文件负责启动任务,简单说就是执行文件,这个要与 task.json 中的 label 名称一致 
33                                         //而Task.json文件就是负责配置相关任务,简单说就是负责编译与链接并生成可执行文件.所以launch.json文件前,必须要执行Task.json文件
34         }
35     ]
36 }

 

4.再次F5调试试一下,当然是报错找不到任务 Hello 了,因为你还没有写task.json文件啊

5.按下 ctr+shift+p 进入搜索框,找到任务配置

6.点击任务配置后,就出现了任务配置的模板选项

7.选择'使用模板'创建

8.然后在选择Others,就出现了Task.json

 1 {
 2     // See https://go.microsoft.com/fwlink/?LinkId=733558
 3     // for the documentation about the tasks.json format
 4     "version": "2.0.0",
 5     "tasks": [
 6         {
 7             "label": "Hello",   //一定要和Launch.json-preLaunchTask的参数一致 
 8             "type": "shell",    //无需修改
 9             "command": "g++",   //这里我们使用的 g++ 命令
10             "args": [           //这一部分是自己添加的,是给命令添加的参数
11                                 //实际就是在终端执行(以 Main.cpp为例):
12                                 // g++ -g Main.cpp -o Main.out
13                                 //命令执行后,在文件空间下出现Main.out文件,这样 Launch.json文件就可以负责运行该可执行文件了
14                 "-g",
15                 "${file}",
16                 "-o",
17                 "${fileBasenameNoExtension}.out"
18             ]
19         }
20     ]
21 }

 

9.再F5调试一下,就可以了,还可以添加断点调试(这不,执行成功了)

 

三.

你以为结束了,No,你还是太天真了

虽然这样可以实现单个文件的编译链接与执行,但是对于多文件来说却不行:

0.说明一下,这里的多文件是指:包含多个.cpp文件(多个.h与一个.cpp不算作多文件,因为可以通过链接到一起)

1.我们直接举个例子吧,新建A.h

1 #ifndef A_H
2 #define A_H
3 
4 class A{
5     public :
6     void Say();
7 };
8 
9 #endif

 

2.新建A.cpp

1 #include<iostream>
2 #include"A.h"
3 
4 void A::Say(){
5     std::cout<<"Hello Linux!";
6 }

 

3.修改Main.cpp

 1 #include<iostream>
 2 #include"A.h"
 3 
 4 int main(void){
 5     
 6     A *a=new A();
 7     a->Say();
 8     //std::cout<<"Hello Linux"<<std::endl;
 9     return 1;
10 }

 

4.F5试一试,报错:没定义接口 A::Say(). 为什么会这样,仔细看A.h,因为我们定义了一个方法,但是没有实现他,这又不是抽象类,所以必须要实现方法,你在Main.cpp中调用该方法,但是该方法在A.h中没有实现,Main.cpp链接A.h后,编译器仍然不认识他,所以就会报错

四.

0.通过 make --version 查看有没有安装make,没有安装请自行安装

1.怎么解决呢,这个时候就用到make了,make是通过嵌套使用g++ 实现多文件的编译,make是怎么执行的呢? 首先,make指令,会查找你指定的文件空间下有没有makefile文件,如何makefile存在就按照makefile中的内容执行,算了,说不明白,还是看下面的例子吧.

2.在当前文件空间下新建文件, 文件名为makefile (如图)

3.修改task.json

 1 {
 2     // See https://go.microsoft.com/fwlink/?LinkId=733558
 3     // for the documentation about the tasks.json format
 4     "version": "2.0.0",
 5     "tasks": [
 6         {
 7             "label": "Hello",   //一定要和Launch.json-preLaunchTask的参数一致 
 8             "type": "shell",    //无需修改
 9 
10             "command": "make",  //这里进行了修改,使用的是 make 命令
11 
12         /*    "args": [           //这一部分是自己添加的,是给命令添加的参数
13                                 //实际就是在终端执行(以 Main.cpp为例):
14                                 // g++ -g Main.cpp -o Main.out
15                                 //命令执行后,在文件空间下出现Main.out文件,这样 Launch.json文件就可以负责运行该可执行文件了
16                 "-g",
17                 "${file}",
18                 "-o",
19                 "${fileBasenameNoExtension}.out"
20             ]*/
21             "args": [           //应该是可写可不写,关于文件路径这一块有很多的坑,希望大家注意
22                 "-C",
23                 "${workspaceFolder}"
24             ]
25         }
26     ]
27 }

 

4.修改Launch.json , 就该了一处 "program": "${workspaceFolder}/Hello1", //因为要与makefile定义的文件名相匹配

5.makefile 内容如下: 我写了两个版本,其实本质上都是一样的,大家可以体会一下,另外希望大家可以自行学习make命令的语法以及使用,在这里我暂不赘述(其实自己不是很懂,哈哈)

1 Hello1: Main.o A.o
2     g++ -g  -o Hello1 Main.cpp A.cpp    #一定要缩进,而且必须是Tab键缩进,不信,你试试
3 clean: 
4     rm Main.o  A.o 
1 Hello1: Main.o A.o
2     g++ -o Hello1 Main.o A.o    #一定要缩进,而且必须是Tab键缩进,不信,你试
3 Main.o: Main.cpp A.h
4     g++ -g -c Main.cpp
5 A.o: A.h A.cpp
6     g++ -g -c A.cpp
7 clean: 
8     rm Main.o A.o     
9     

6.F5 , perfect!

 

五.结束

 

刚刚接触linux系统没有多久,有许多基本命令都不会使用,就着急开始写代码.遇到的第一个问题当然是该用什么IDE.虽然网上有很多大神都推荐直接用G++肝,但是作为小弱鸡的我实在是接受不了(手动狗头).接下来当然是打开百度,输入"Linux C++ IDE"这几个关键字,点击搜索,推荐的可太多了,我试过VScode,Netbeans,Eclipse,Codeblocks,当然还有许多的代码编辑器(如:Sublime),因为一开始的时候被今天的主角--两个json文件给劝退了,所以一开始放弃了VSCODE,前前后后断断续续不知道捣鼓了多久,哪一个软件都没有调试好,最后只能...不说了,一言难尽!

 

以此篇纪念我Linux之旅的开始,加油!

posted @ 2019-10-10 14:14  乌鸦爱说话  阅读(17407)  评论(0编辑  收藏  举报