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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM