亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

Linux中使用VS Code編譯調試C++項目詳解

2020-05-23 13:58:25
字體:
來源:轉載
供稿:網友

前言

關于VS Code在Linux下的安裝這里就不提了,不管是CentOS還是Ubuntu,如果不懂且搜問題足夠的情況下,你會解決的。

一、前置知識——gcc/g++的編譯鏈接過程

在Windows下,如果你用Visual Studio進行開發,C/C++的編譯器一般采用微軟提供的MSBuild;在Linux下C/C++的編譯器大多采用gcc/g++。既然要在Linux下進行C++開發,很有必要了解一下g++編譯器的一些基本知識。

假設我現在有一個最簡單的C++文件:

 #include <iostream> using namespace std; int main() { cout << "Hello, world!!!!" << endl; return 0; }

接下來如何編譯呢?簡單來說分成兩步:先編譯,再鏈接

1. 安裝g++編譯器

啟動終端,進入root模式,安裝gcc和g++

Ubuntu:

CentOS:

[xxx@xxx ~]$ su[xxx@xxx ~]# yum install gcc[xxx@xxx ~]# gcc --version[xxx@xxx ~]# yum install gcc-g++[xxx@xxx ~]# g++ --version

2. 編譯hello.cpp

[xxx@xxx ~]$ g++ -c hello.cpp

輸出結果是一個hello.o文件,這是編譯過程的生成的中間文件。-c 表示只編譯,不鏈接。

3. 鏈接hello.o生成hello.out

[xxx@xxx ~]$ g++ -o hello.out hello.o

輸出結果是一個hello.out文件,這是最終的可執行文件。-o 表示輸出文件,hello.o是上一步生成的.o文件。

當然,如果第2、3步是可以合并執行,直接執行命令

[xxx@xxx ~]$ g++ -o hello.out hello.cpp

然而第2、3步分開執行是有意義的,后面會講到。

4. 運行hello.out

最后執行以下hello.out驗證一下輸出結果唄

[xxx@xxx ~]$ ./hello.out

二、構建項目

實際開發過程中當然不可能只有一個cpp這么簡單,有時候會有非常多的.h和.cpp文件相互配合,那么上面直接通過g++編譯可執行文件就沒那么簡單了。我們需要借助Make這個強大的項目構建工具,幫助我們構建和組織項目代碼。

假設現在有如下3個文件:hw2.cpp、solution.h和solution.cpp

 /* solution.h */ class Solution { public: void Say(); };
/* solution.cpp */ #include <iostream> #include "solution.h" void Solution::Say(){ std::cout << "HI!" << std::endl; }
 /* hw2.cpp */ #include "solution.h" int main () { Solution sln; sln.Say(); return 0; }

可以看到這個簡單例子包括頭文件引用、定義和實現分離等情況,如果直接g++ -o hw2.out hw2.cpp將會報未定義引用的錯誤:

[xxx@xxx ~]$ g++ -o hw2.out hw2.cpp

/tmp/ccIMYTxf.o:在函數‘main'中:

hw2.cpp:(.text+0x10):對‘Solution::Say()'未定義的引用

collect2: 錯誤:ld 返回 1

 

這時Make就該大顯身手了。

首先我們還需要了解一下makefile。

在項目的根目錄下創建一個makefile文件,以告訴Make如何編譯和鏈接程序。

build : hw2.o solution.o g++ -o build hw2.o solution.o #注意前面必須是tab,不能是空格 hw2.o : hw2.cpp solution.h g++ -g -c hw2.cpp solution.o : solution.h solution.cpp g++ -g -c solution.cpp clean : rm hw2.o solution.o build

先來解釋一下makefile的基本語法規則:

target ... : prerequisites ...  command #注意前面是tab

target是一個目標文件,可以是Object File,也可以是執行文件,還可以是一個標簽;

prerequisites是要生成那個target所需要的文件或是目標;

command是make需要執行的命令(任意的Shell命令)。

說白了就是target這一個或多個目標,依賴于prerequisites列表中的文件,其執行規則定義在command里。如果prerequisites列表中文件比target要新,就會執行command,否則就跳過。這就是整個make過程的基本原理。

 

那么,我們回頭看看上面定義的makefile文件,我們解釋一下每兩行的作用

 build : hw2.o solution.o g++ -o build hw2.o solution.o

target是build,依賴于hw2.o 和 solution.o,執行的命令是 g++ -o build hw2.o solution.o

意思是通過g++鏈接hw2.o和solution.o,生成可執行文件build,prerequisites有兩個.o文件,是因為代碼里hw2引用了solution.h。

hw2.o : hw2.cpp solution.h g++ -g -c hw2.cpp

target是hw2.o,依賴于hw2.cpp和solution.h,執行命令是g++ -g -c hw2.cpp

意思是通過g++編譯hw2.cpp文件,生成hw2.o文件,g++命令中 -g 表示生成的文件是可調試的,如果沒有-g,調試時無法命中斷點。

 solution.o : solution.h solution.cpp g++ -g -c solution.cpp

同上,編譯solution.cpp文件,生成solution.o文件。

clean : rm hw2.o solution.o build

這里clean不是一個可執行文件,也不是一個.o文件,它只不過是一個動作名字,類似于label的作用,make不會去找冒號后的依賴關系,也不會自動執行命令。如果要執行該命令,必須在make后顯示指出整個動作的名字,如make clean。

好了,接下來說一下make的工作原理。在默認的方式下,我們只需輸入make,則發生了以下行為:

     a. make在當前目錄下找名為makefile或Makefile的文件;

     b. 如果找到,它會找文件中的第一個target,如上述文件中的build,并作為終極目標文件;

     c. 如果第一個target的文件不存在,或其依賴的.o 文件修改時間要比target這個文件新,則會執行緊接著的command來生成這個target文件;

     d. 如果第一個target所依賴的.o文件不存在,則會在makefile文件中找target為.o的依賴,如果找到則執行command,.o的依賴必是.h或.cpp,于是make可以生成 .o 文件了

     e. 回溯到b步執行最終目標

看一下執行結果

[xxx@xxx ~]$ makeg++ -g -c hw2.cppg++ -g -c solution.cppg++ -o build hw2.o solution.o #注意前面必須是tab,不能是空格[xxx@xxx ~]$ ./build HI![xxx@xxx ~]$

由于makefile文件中加了-g這一選項,于是可以通過gdb進行調試,并且會命中斷點,這里感興趣可以再了解一下gdb的使用。

接下來我們要說到如何通過VS Code進行調試。

三、在VS Code中編譯調試

首先安裝完VS Code之后,還需要安裝一下擴展cpptools,請自行完成。

vs,code,調試,linux,編譯調試,vscode,c

點擊菜單 查看-> 調試,或直接快捷鍵ctrl + shift + D

vs,code,調試,linux,編譯調試,vscode,c

點擊設置圖標,在彈出的選擇環境中選擇C++(GDB/LLDB),會自動創建一個launch.json文件

vs,code,調試,linux,編譯調試,vscode,c

顧名思義,laucn.json的作用是告訴VS Code如何執行啟動任務,也就是我們要把什么文件啟動起來,在上述例子中顯然是build這個可執行文件了。修改一下json文件中波浪線的program節點,改成${workspaceRoot}/build,其余的暫時不變

1 { 2  "version": "0.2.0", 3  "configurations": [ 4   { 5    "name": "C++ Launch", 6    "type": "cppdbg", 7    "request": "launch", 8    "program": "${workspaceRoot}/build", 9    "args": [],10    "stopAtEntry": false,11    "cwd": "${workspaceRoot}",12    "environment": [],13    "externalConsole": true,14    "linux": {15     "MIMode": "gdb"16    },17    "osx": {18     "MIMode": "lldb"19    },20    "windows": {21     "MIMode": "gdb"22    }23   },24   {25    "name": "C++ Attach",26    "type": "cppdbg",27    "request": "attach",28    "program": "${workspaceRoot}/build",29    "processId": "${command.pickProcess}",30    "linux": {31     "MIMode": "gdb"32    },33    "osx": {34     "MIMode": "lldb"35    },36    "windows": {37     "MIMode": "gdb"38    }39   }40  ]41 }

接著我們嘗試一下F5,開始調試,結果可以看到報了一個缺少build文件的錯誤。原因是我們還沒執行make編譯出可執行文件呢。我們在launch.json文件中,添加一個preLaunchTask的節點,并設置值為“build”。注意這里的build不是指可執行文件build,而是一個名為build的任務!

 1 { 2  "version": "0.2.0", 3  "configurations": [ 4   { 5    "name": "C++ Launch", 6    "type": "cppdbg", 7    "request": "launch", 8    "program": "${workspaceRoot}/build", 9    "args": [],10    "stopAtEntry": false,11    "cwd": "${workspaceRoot}",12    "environment": [],13    "externalConsole": true,14    "preLaunchTask": "build",15    "linux": {16     "MIMode": "gdb"17    },18    "osx": {19     "MIMode": "lldb"20    },21    "windows": {22     "MIMode": "gdb"23    }24   },25   {26    "name": "C++ Attach",27    "type": "cppdbg",28    "request": "attach",29    "program": "${workspaceRoot}/build",30    "processId": "${command.pickProcess}",31    "linux": {32     "MIMode": "gdb"33    },34    "osx": {35     "MIMode": "lldb"36    },37    "windows": {38     "MIMode": "gdb"39    }40   }41  ]42 }

再嘗試F5,會提示一個信息:

vs,code,調試,linux,編譯調試,vscode,c

點擊配置任務運行程序,并選擇Others, 會自動生成一個tasks.json文件,這個文件的作用就是告訴launch或者編譯器需要執行什么操作。顯然我們這里要執行make命令,修改tasks.json為如下:

1 { 2  "version": "0.1.0", 3  "command": "make", 4  "showOutput": "always", 5  "tasks": [ 6   { 7    "taskName": "clean" 8   }, 9   {10    "taskName": "build",11    "problemMatcher": {12     "owner": "cpp",13     "fileLocation": ["relative", "${workspaceRoot}"],14     "pattern": {15      "regexp": "^(.*):(//d+):(//d+)://s+(warning|error)://s+(.*)$",16      "file": 1,17      "line": 2,18      "column": 3,19      "severity": 4,20      "message": 521     }22    }23   }24  ]25 }

其中tasks節點是一組任務,注意到其中一個名為build的任務,這就是launch.json文件中指定的preLaunchTask,表明在啟動可執行程序之前,會先執行一下preLaunchTask即這里的build任務,重新make一下代碼,更新可執行程序之后再啟動。

當然也可以指運行tasks這些任務而不啟動可執行程序,直接ctrl + shift + B,在VSC的console里可以看到和終端執行一樣的輸出:

vs,code,調試,linux,編譯調試,vscode,c

執行完后,項目中會多出.o和build文件

vs,code,調試,linux,編譯調試,vscode,c

 

關于VS Code的launch.json和tasks.json中更多節點的含義,參考

https://code.visualstudio.com/docs/editor/debugging

https://code.visualstudio.com/docs/editor/tasks

接著設置好斷點之后F5,就可以進入斷點調試了

vs,code,調試,linux,編譯調試,vscode,c

總結

本文主要總結了gcc/g++和make/makefile的基礎知識,以及在Linux下使用VS Code進行調試開發的方法,希望對正在挖坑的同學有所幫助,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品jizz在线观看麻豆| 国产亚洲精品一区二555| 国产a级全部精品| 国产在线播放91| 国产成人高潮免费观看精品| 色综合天天综合网国产成人网| 亚洲精品免费在线视频| 精品久久久久久久久久久| 中文字幕视频在线免费欧美日韩综合在线看| 亚洲第一区第二区| 中文字幕日韩在线视频| 日韩欧亚中文在线| 国产精品9999| 欧美插天视频在线播放| 欧美高清不卡在线| 中文字幕欧美在线| 91沈先生作品| 国产精品成人免费视频| 成人免费大片黄在线播放| 欧美高清自拍一区| 精品在线小视频| 91精品国产91久久久久久久久| 亚洲第一页在线| 成人精品一区二区三区电影免费| 国产精品久久久久久久久久久久久久| y97精品国产97久久久久久| 亚洲欧美变态国产另类| 欧美中文在线视频| 欧美性猛交xxxx免费看漫画| 欧美日韩高清区| 亚洲欧美在线免费观看| 久久久欧美一区二区| 国产精品自产拍在线观看| 久久久久久九九九| 26uuu另类亚洲欧美日本老年| 欧美午夜性色大片在线观看| 欧美福利视频网站| 92福利视频午夜1000合集在线观看| 日韩av免费在线| 日韩成人激情视频| 精品欧美国产一区二区三区| 久操成人在线视频| 成人欧美一区二区三区在线| 欧美激情高清视频| 欧洲s码亚洲m码精品一区| 国产亚洲精品一区二555| 中文字幕亚洲综合久久| 欧美激情视频一区| 亚洲国产日韩一区| 欧美精品18videosex性欧美| 国产精品99蜜臀久久不卡二区| 国产精品美腿一区在线看| 亚洲精品永久免费| 亚洲精品久久视频| 亚洲理论片在线观看| 欧美精品一区在线播放| 国产精品男女猛烈高潮激情| 国产精品电影一区| 亚洲精品久久久久久久久久久久| 欧美日韩国产一区二区| 日韩免费观看网站| 精品久久久视频| 国产精品ⅴa在线观看h| 91精品综合视频| 欧美大人香蕉在线| 国产日韩欧美自拍| 久久色精品视频| 中文字幕欧美日韩va免费视频| 亚洲精品免费av| 一区二区三区www| 国产日韩在线观看av| 国产亚洲精品综合一区91| 亚洲国产精品va在线观看黑人| 精品久久久久久久久久ntr影视| 国产欧美日韩中文字幕| 国产欧美一区二区三区在线| 伊人久久久久久久久久久| 欧美午夜丰满在线18影院| 国产精品高潮呻吟久久av野狼| 91精品国产综合久久久久久久久| 国产精品夜色7777狼人| 欧美第一淫aaasss性| 91禁外国网站| 欧美性猛xxx| 黑人精品xxx一区一二区| 日韩高清电影免费观看完整版| 深夜福利亚洲导航| 亚洲香蕉在线观看| 欧美亚洲一级片| 国产主播喷水一区二区| 97超级碰碰人国产在线观看| 亚洲最大的网站| 国内精品国产三级国产在线专| 久久久久久这里只有精品| 97国产成人精品视频| 国产一区私人高清影院| 日韩免费av一区二区| 狠狠躁夜夜躁人人爽天天天天97| 欧洲s码亚洲m码精品一区| 亚洲第一福利网站| 色综久久综合桃花网| 欧美午夜无遮挡| 538国产精品视频一区二区| 国产精品久久久久久亚洲调教| 秋霞午夜一区二区| 中文字幕亚洲二区| 91热精品视频| 欧美性猛交xxxx乱大交| 欧美日韩成人免费| 国产99视频在线观看| 日韩视频―中文字幕| 亚洲三级 欧美三级| 国产成人久久久精品一区| 亚洲欧美日本精品| 国产综合在线看| 97久久精品视频| 懂色av影视一区二区三区| 国产亚洲精品久久久久动| 久久精品一偷一偷国产| 欧美日韩加勒比精品一区| 国产日韩专区在线| 欧美视频国产精品| 日韩动漫免费观看电视剧高清| 57pao国产精品一区| 国产精品专区h在线观看| 亚洲国产精品推荐| 久久久视频在线| 日本亚洲精品在线观看| 97精品伊人久久久大香线蕉| 97国产精品人人爽人人做| 欧日韩在线观看| 亚洲国产精品久久| 91国偷自产一区二区三区的观看方式| 成人字幕网zmw| 国产日韩欧美在线看| 欧美激情精品久久久久久大尺度| 亚洲最大福利网站| 欧美疯狂做受xxxx高潮| 国产精品人成电影在线观看| 欧美成人精品不卡视频在线观看| 久久精品国产亚洲精品| 欧美日本黄视频| 亚洲第一色在线| 亚洲欧美色婷婷| 国产精品成人一区二区| 欧美成人午夜激情在线| 久青草国产97香蕉在线视频| 成人福利免费观看| 九九九热精品免费视频观看网站| 国产精品揄拍一区二区| 国产日韩欧美在线看| 欧美老少配视频| 色婷婷av一区二区三区久久| 色噜噜国产精品视频一区二区| 久久久久久久国产精品| 国产精品扒开腿爽爽爽视频| 亚洲精品免费网站| 中文字幕欧美亚洲| 91精品国产一区| 丁香五六月婷婷久久激情| 日韩视频免费观看| 久99久在线视频| 国产精品久久久久久av福利软件| 成人精品久久一区二区三区|