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

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

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

2020-01-26 14:22:11
字體:
來源:轉載
供稿:網友

前言

關于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,請自行完成。

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

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

顧名思義,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,會提示一個信息:

點擊配置任務運行程序,并選擇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里可以看到和終端執行一樣的輸出:

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

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

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

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

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

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91香蕉嫩草神马影院在线观看| 69av成年福利视频| 国内精品国产三级国产在线专| 国产精品极品美女粉嫩高清在线| 精品视频在线导航| 日韩av电影在线免费播放| 国产在线精品成人一区二区三区| 亚洲图中文字幕| 亚洲乱亚洲乱妇无码| 在线观看日韩专区| 国产成人啪精品视频免费网| 国内精品一区二区三区四区| 91久久精品国产91久久性色| 国模吧一区二区| 亚洲www在线观看| xxxx欧美18另类的高清| 亚洲欧美色图片| 国产精品中文字幕久久久| 国产在线精品自拍| 久久久久久久网站| 亚洲人成在线一二| 亚洲第一网站男人都懂| 欧美在线观看www| 国产成+人+综合+亚洲欧美丁香花| 91香蕉电影院| 精品激情国产视频| 久久久国产精彩视频美女艺术照福利| 国产日韩精品入口| 欧美一区三区三区高中清蜜桃| 欧美一级片免费在线| 欧美黄色成人网| 久久精品91久久香蕉加勒比| 日韩在线免费视频| 欧美激情在线一区| 亚洲码在线观看| 亚洲一区www| 国产精品入口夜色视频大尺度| 亚洲综合日韩中文字幕v在线| 清纯唯美日韩制服另类| 国产女人精品视频| 日韩欧美在线观看视频| 欧美黑人性视频| 九九精品在线播放| 欧美国产日韩一区二区三区| 91po在线观看91精品国产性色| 国产精品扒开腿爽爽爽视频| 亚洲欧美日韩在线一区| 精品毛片三在线观看| 成人羞羞国产免费| 亚洲精品wwwww| 最近的2019中文字幕免费一页| 亚洲国产精品系列| 亚洲激情 国产| 久久久久久久久久亚洲| 97精品国产91久久久久久| 国产98色在线| 日韩av不卡在线| 日韩精品久久久久久久玫瑰园| 欧美大码xxxx| 97精品伊人久久久大香线蕉| 亚洲大尺度美女在线| 国产成人综合精品| 亚洲人av在线影院| 久久精品视频网站| 中文字幕不卡av| 久久亚洲国产精品成人av秋霞| 国产精品自产拍在线观看| 久久久精品亚洲| 日韩黄色在线免费观看| 91成人在线播放| 欧美精品久久久久久久免费观看| 日韩经典一区二区三区| 免费97视频在线精品国自产拍| 亚洲乱码国产乱码精品精| 不卡av在线网站| 欧美色欧美亚洲高清在线视频| 欧美理论电影在线观看| 国产精品青草久久久久福利99| 日本不卡免费高清视频| 国产成人在线一区| 久久久国产精彩视频美女艺术照福利| 欧美日韩另类在线| 亚洲第一视频网站| 亚洲第一在线视频| 2021国产精品视频| 精品中文字幕在线2019| 国产欧美一区二区三区在线| 国产成人精品日本亚洲专区61| 韩国19禁主播vip福利视频| 久久国产精品久久久久久| 中文字幕久久精品| 欧美日韩视频免费播放| 亚洲国产婷婷香蕉久久久久久| 欧美日韩国产精品| 日日骚久久av| 欧美国产日产韩国视频| 久久精品国产一区二区三区| 国产成人精品久久亚洲高清不卡| 亚洲电影成人av99爱色| 久久精品成人欧美大片古装| 亚洲成人激情在线观看| 欧美在线不卡区| 亚洲黄色av网站| 92福利视频午夜1000合集在线观看| 久久久欧美一区二区| 亚洲天堂第二页| 日韩男女性生活视频| 日韩欧美亚洲国产一区| 久久久国产精彩视频美女艺术照福利| 欧美激情久久久久| 国产成+人+综合+亚洲欧美丁香花| 成人网欧美在线视频| 亚洲精品视频在线观看视频| 神马久久桃色视频| 国产精品亚洲аv天堂网| 欧美性生活大片免费观看网址| 国产美女久久精品香蕉69| 欧美日韩一区二区三区在线免费观看| 一本一本久久a久久精品牛牛影视| 91av免费观看91av精品在线| 欧美日韩国产一区中文午夜| 91精品久久久久久久久久久久久| 久久久免费高清电视剧观看| 欧洲成人在线视频| 夜夜狂射影院欧美极品| 国产欧美日韩91| 欧美性猛交xxxx免费看久久久| 久久久久久久久久婷婷| 91国自产精品中文字幕亚洲| 国产精品极品美女在线观看免费| 最近2019中文字幕第三页视频| 尤物99国产成人精品视频| 国产一区二区久久精品| 久久精品视频在线观看| 91日韩在线视频| 久久久精品视频成人| 成人有码在线视频| 欧美乱大交xxxxx另类电影| 久久久久久久久久av| 久久人人97超碰精品888| 最近中文字幕mv在线一区二区三区四区| 亚洲精品电影网站| 国产a∨精品一区二区三区不卡| 国产亚洲欧洲高清| 精品国产精品自拍| 国产一区二区成人| 欧美激情综合色| 91久久精品国产91久久性色| 久久99国产综合精品女同| 国产精品中文字幕久久久| 欧美裸体视频网站| 免费av一区二区| 97超视频免费观看| 久久精品国产v日韩v亚洲| 国产视频自拍一区| 久久久久久久久亚洲| 日韩欧美国产激情| 欧美成人第一页| 亚洲天堂免费观看| 2025国产精品视频| 欧美日韩加勒比精品一区| 亚洲精品一区久久久久久| 日韩电影中文字幕一区| 亚洲欧美日本另类|