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之旅的开始,加油!