首先要感謝的是這位大神: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之旅的開始,加油!