1. 程式人生 > >在CentOS 7中使用VS Code編譯調試C++項目

在CentOS 7中使用VS Code編譯調試C++項目

ace found target makefile mic ext false format 指定

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++項目