在CentOS 7中使用VS Code編譯調試C++項目
1. 安裝VSCODE
見VSCode官方鏈接 https://code.visualstudio.com/docs/setup/linux#_rhel-fedora-and-centos-based-distributions
先下載yum源:
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc sudo sh -c ‘echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/vscode.repo‘
安裝VSCODE
yum check-update #更新yum源 yum -y install code #安裝VSCode
2. 安裝GCC
yum -y install gcc gcc-g++
3. C/C++編譯過程
假設我們有如下代碼hello.cc需要進行編譯
#include <iostream> using namespace std; int main() { cout << "Hello, VS Code!" << endl; return 0; }
GCC編譯器按照編譯->鏈接兩步來生成應用程序。其中編譯生成的結果是.o文件,鏈接會生成可執行程序或靜態/動態庫文件,在linux中為.a, .sa, .la為後綴的文件,可執行文件在linux中可以沒有後綴,如果沒有特別指定,默認為a.out.
3.1 編譯hello.cc
g++ -c hello.cc
輸出結果是一個hello.o文件,這是編譯過程的生成的中間文件。-c 表示只編譯,不鏈接。
3.2 鏈接hello.o生成hello.out
g++ -o hello.out hello.o
其中-o 表示生成的目標文件的名稱,如果不指定,默認的文件名為a.out,生成的,目標文件可以沒有後綴,也就是說以下命令也是正確的
g++ -o hello hello.o
當然,如果第1、2步是可以合並執行,直接執行命令
g++ -o hello.out hello.cpp
3.3 運行hello.out
./hello.out
輸出如下:
Hello, VS Code!
4. 構建項目
4.1 安裝make
Linux中,構建項目要用到make,先確認make已經安裝,在控制臺輸入如下指令:
make -v
如果已經安裝make,則會輸出make的版本信息
GNU Make 3.82 Built for x86_64-redhat-linux-gnu Copyright (C) 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.
否則,就沒有安裝make,要安裝make,使用以下命令:
yum -y install cmake
4.2 準備構建腳本
在當前項目根目錄下,輸入
vi makefile
在makefile中輸入如下內容:
1 hello:hello.o 2 g++ hello.o -o hello #按照makefile 語法,前面的不是空格,而是tab鍵,否則構建會失敗 3 hello.o:hello.cc 4 g++ -c -g -o hello.o hello.cc #按照makefile 語法,前面的不是空格,而是tab鍵,否則構建會失敗 5 clean: 6 rm -f *.o #按照makefile 語法,前面的不是空格,而是tab鍵,否則構建會失敗
輸入:wq保存退出.
解釋一下makefile的語法,
target ... : prerequisites ...
command #註意前面是tab,而不是空格
target是一個目標文件,可以是Object File,也可以是執行文件,還可以是一個標簽;
prerequisites是要生成那個target所需要的文件或是目標;
command是make需要執行的命令(任意的Shell命令)。
說白了就是target這一個或多個目標,依賴於prerequisites列表中的文件,其執行規則定義在command裏。如果prerequisites列表中文件比target要新,就會執行command,否則就跳過。這就是整個make過程的基本原理。
註意第3行中的 -g參數,在生成hello.o文件過程中,g++命令中 -g 表示生成的文件是可調試的,如果沒有-g,調試時無法命中斷點。
在默認情況下,只需輸入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步執行最終目標
測試一下makefile的執行情況:
[root@lenmomDesktop hello]# ls -l #查看執行前的文件列表,只有兩個文件 hello.cc makefile
total 8
-rw-rw-r-- 1 lenmom lenmom 174 Jun 17 17:05 hello.cc
-rw-rw-r-- 1 lenmom lenmom 115 Jun 17 17:43 makefile
[root@lenmomDesktop hello]# make #執行make
g++ -c -g -o hello.o hello.cc
g++ hello.o -o hello
[root@lenmomDesktop hello]# ls -l #查看make之後的文件列表,發現多了hello和hello.o兩個文件
total 56
-rwxr-xr-x 1 root root 21128 Jun 17 20:27 hello
-rw-rw-r-- 1 lenmom lenmom 174 Jun 17 17:05 hello.cc
-rw-r--r-- 1 root root 23896 Jun 17 20:27 hello.o
-rw-rw-r-- 1 lenmom lenmom 115 Jun 17 17:43 makefile
[root@lenmomDesktop hello]# ./hello #執行hello文件
hello VS Code #hello的執行輸出
[root@lenmomDesktop hello]# make clean #執行make clean清除中間文件
rm -f *.o
[root@lenmomDesktop hello]# ls -l #查看執行clean之後的文件列表,發現hello.o已經沒有了
total 32
-rwxr-xr-x 1 root root 21128 Jun 17 20:27 hello
-rw-rw-r-- 1 lenmom lenmom 174 Jun 17 17:05 hello.cc
-rw-rw-r-- 1 lenmom lenmom 115 Jun 17 17:43 makefile
5. vscode調試
5.1 安裝gdb
yum -y install gdb
5.2 創建launch.json
mkdir ./.vscode vi ./.vscode/launch.json
輸入以下內容:
1 { 2 // Use IntelliSense to learn about possible attributes. 3 // Hover to view descriptions of existing attributes. 4 // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 "version": "0.2.0", 6 "configurations": [ 7 8 { 9 "name": "C++ Launch", 10 "type": "cppdbg", 11 "request": "launch", 12 "program": "${workspaceFolder}/hello", 13 "args": [], 14 "stopAtEntry": false, 15 "cwd": "${workspaceFolder}", 16 "environment": [], 17 "externalConsole": false, 18 "MIMode": "gdb", 19 "preLaunchTask": "build", 20 "setupCommands": [ 21 { 22 "description": "Enable pretty-printing for gdb", 23 "text": "-enable-pretty-printing", 24 "ignoreFailures": true 25 } 26 ] 27 } 28 ] 29 }
其中第12行,表示啟動的程序的名稱,本例中build之後的輸出文件為hello。
第19行,build表示在啟動調試之前,要做的任務,顯然在調試之前應該編譯工程,也就是要make 執行以下makefile,產生最新的項目輸出。
所以我們還要創建一個構建任務的Json文件,其中任務名稱為build,這個任務被launch引用,也就是第19行中的build的含義。
vi ./.vscode/tasks.json
輸入以下內容:
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"reveal": "always",
"tasks": [
{
"args": ["-f", "makefile"],
"label":"build",
"type": "shell",
"command": "make"
}
]
}
這個task的意思是,在shell命令行中執行make -f makefile
接下來在vscode中選擇C++ Launch【launch.json文件中的name】,點擊調試按鈕即可進行項目調試了。
在CentOS 7中使用VS Code編譯調試C++項目