加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • VSCode 的預(yù)定義變量
    • 索引(鍵)”: “內(nèi)容(值)
    • 編譯多個源文件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

VSCode自制的IDE編譯多個源文件

2021/01/26
278
閱讀需 8 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

前一篇文章中,我們講述了如何利用 VSCode 軟件來搭建一個 C 語言的開發(fā)環(huán)境,這個 C 語言的開發(fā)環(huán)境和我們之前《樂創(chuàng) C 語言教程》里面所講述的有很大差別,這些差別在我看來對于那些已經(jīng)了解 C 語言命令行編譯過程的童鞋來說是一個福音,因為它可以大大地省去我們每次編譯時需要輸入的命令。當(dāng)然,如果你一開始學(xué)習(xí) C 語言就使用這樣省事的工具,對你自身了解 C 語言的編譯步驟以及文件依賴關(guān)系來說,并不是一件好事。所以,我也衷心希望剛剛接觸 C 語言的童鞋還是按照我們《樂創(chuàng) C 語言教程》里面所講述的工具來學(xué)習(xí) C 語言,等到了解了這些編譯的過程,再來搭建這個 VSCode IDE。

VSCode 的預(yù)定義變量

我們上一篇文章中講述了如何將 MinGW 工具嵌入到 VSCode 文本編輯器中,在這個配置的過程中,我們只需要通過修改 VSCode 生成的“luanch.json”和“task.json”兩個 JSON 文件中的特定字段,就可以實現(xiàn)開發(fā)環(huán)境的搭建。那么這里可能就會有讀者疑惑了,這些字段既然是 VSCode 提供的,那么有沒有一張詳細(xì)羅列這些參數(shù)的表格,以備自己的不時之需。這個答案是肯定的,VSCode 編輯器的官網(wǎng)有相關(guān)的文檔專門來解釋這些 JSON 文檔中的關(guān)鍵字段,詳情可以參考 VSCode 官方文檔:https://code.visualstudio.com/docs/editor/variables-reference。這里我們也來簡單地講述下。

圖 1 task.json

如圖 1 所示的“task.json”中的內(nèi)容。這個文件中的后綴名是“.json”,關(guān)于“json”我們在這里簡單介紹下,JSON(JavaScript Object Notation, JS 對象簡譜) 是一種輕量級的數(shù)據(jù)交換格式。它基于 ECMAScript (歐洲計算機(jī)協(xié)會制定的 js 規(guī)范)的一個子集,采用完全獨立于編程語言的文本格式來存儲和表示數(shù)據(jù)。簡潔和清晰的層次結(jié)構(gòu)使得 JSON 成為理想的數(shù)據(jù)交換語言。

JSON 文件的內(nèi)容都是以“鍵 - 值對”的形式存在的,鍵值對是一種高級語言廣泛支持的符合數(shù)據(jù)類型,在某些高級語言中也被稱為“字典”,其內(nèi)部的每一個數(shù)據(jù)項的結(jié)構(gòu)為:

索引(鍵)”: “內(nèi)容(值)

在 VSCode 中,它提供兩個用以配置 VSCode 任務(wù)的文件,“launch.json”以及”tasks.json”。“launch.json”為調(diào)試配置文件,這里面指定了啟動調(diào)試之后的調(diào)試器命令,以及調(diào)試之前的任務(wù)。這里我們可以將編譯任務(wù)在這里指出。

“task.json”為編譯任務(wù)配置文件,這里指出了編譯任務(wù)的命令以及具體參數(shù)。

再仔細(xì)觀察圖 1,我們發(fā)現(xiàn)其中很多字段對應(yīng)的變量是以“${變量名}”形式出現(xiàn)的,這些變量名其實在 VSCode 中是被事先定義好的,有點類似于我們操作系統(tǒng)中的環(huán)境變量,其中部分變量的具體解釋如下:

$ {workspaceFolder} - 在 VS Code 中打開的文件夾的路徑

$ {workspaceFolderBasename} - 在 VS Code 中打開的文件夾名稱,不帶任何斜杠(/)

$ {file} - 當(dāng)前打開的文件

$ {fileWorkspaceFolder} - 當(dāng)前打開的文件的工作區(qū)文件夾

$ {relativeFile} - 當(dāng)前相對于打開的文件 workspaceFolder

$ {relativeFileDirname} - 當(dāng)前打開的文件相對于的目錄名 workspaceFolder

$ {fileBasename} - 當(dāng)前打開的文件的基本名稱

$ {fileBasenameNoExtension} - 當(dāng)前打開的文件的基本名稱,沒有文件擴(kuò)展名

$ {fileDirname} - 當(dāng)前打開的文件的目錄名

$ {fileExtname} - 當(dāng)前打開的文件的擴(kuò)展名

$ {cwd} - 啟動時任務(wù)運(yùn)行程序的當(dāng)前工作目錄

$ {lineNumber} - 活動文件中當(dāng)前選擇的行號

$ {selectedText} - 活動文件中的當(dāng)前選定文本

$ {execPath} - 正在運(yùn)行的 VS Code 可執(zhí)行文件的路徑

$ {defaultBuildTask} - 默認(rèn)構(gòu)建任務(wù)的名稱

$ {pathSeparator} - 操作系統(tǒng)用來分隔文件路徑中的組件的字符

編譯多個源文件

到目前為止,我們講述的 VSCode C 語言編譯器貌似還是只支持單一源文件的編譯。那么如果我有兩個,三個甚至多個源文件的編譯,是不是需要像之前講述的那樣寫 Makefile?

要回答這個問題,最好的辦法就是立即動手寫代碼,我們可以在同一個文件夾中創(chuàng)建一個“a.c”和“a.h”文件,這個文件中只實現(xiàn)輸出一句“Hello world”的功能。定義好函數(shù)之后,我們在“main.c”文件中去包含這個“a.h”,接著去調(diào)用 a.h 中聲明的打印函數(shù),具體代碼如圖 2 所示。

圖 2 新增的“a.c”和“a.h”

//main.c#include#include "a.h"int main(void) {    int number;    printf("input:n");    scanf("%d", &number);    printHello();    if((number > 1) && (number <= 100)) {        printf("Smalln");    } else if((number > 101) && (number <= 200)) {        printf("Middlen");    } else {        printf("Largen");    }    return 0;}
//a.c#include#include "a.h"
void printHello(void) {    printf("Hello world");}

//a.h#ifndef __A_H_#define __A_H_
void printHello(void);
#endif 


然后,我們在上一篇文章編寫的“launch.json”和“task.json”文件基礎(chǔ)上進(jìn)行調(diào)試。結(jié)果 VSCode 拋出了如圖 3 所示的錯誤。

圖 3 編譯輸出錯誤

我們在終端上可以看到其出錯的原因,歸根到底是因為沒有找到“main.c”文件中的“printHello”函數(shù)定義,這個原因是因為編譯器其實是沒有編譯 a.c 這個源文件。那如何才能添加對這個源文件的編譯呢?我們再仔細(xì)來看下,終端提示的錯誤中,在執(zhí)行 “D:softwaremingw64bingcc.exe '-g', 'C:Users1DesktopNumCalmain.c', '-o', 'C:Users1DesktopNumCalmain.exe'”語句時退出的,這句語句其實是我們在“task.json”文件中定義的。

圖 4 task.json

如圖 4 紅框中圈出的便是具體的編譯命令,因此我們在這個編譯命令中只需要增加對“a.c”文件的編譯即可。如圖 5 所示,在原有的“task.json”文件基礎(chǔ)上,增加了對“a.c”文件的編譯。

圖 5 “task.json”中,增加對 a.c 文件的編譯

//task.json{    "version": "2.0.0",    "label": "C/C++: gcc.exe build active file",    "command": "gcc",    "args": [        "-g",        "${file}",        "${fileDirname}\a.c",  // 增加對 a.c 文件的編譯        "-o",        "${fileDirname}\${fileBasenameNoExtension}.exe"    ],
    "problemMatcher": [        "$gcc"    ],    "group": "build",    "detail": "compiler: D:\software\mingw64\bin\gcc.exe",}

//launch.json{    // 使用 IntelliSense 了解相關(guān)屬性。    // 懸停以查看現(xiàn)有屬性的描述。    // 欲了解更多信息,請訪問: https://go.microsoft.com/fwlink/?linkid=830387    "version": "0.2.0",    "configurations": [        {            "name": "build and debug",          // 配置名稱,將會在啟動配置的下拉菜單中顯示            "type": "cppdbg",                   // 配置類型,這里只能為 cppdbg            "request": "launch",                // 請求配置類型,可以為 launch(啟動)或 attach(附加)              "program": "${fileDirname}/${fileBasenameNoExtension}.exe",                                                // 將要進(jìn)行調(diào)試的程序的路徑            "args": [],                         // 程序調(diào)試時傳遞給程序的命令行參數(shù),一般設(shè)為空即可              "stopAtEntry": false,               // 設(shè)為 true 時程序?qū)和T诔绦蛉肟谔?,一般設(shè)置為 false             "cwd": "${fileDirname}",            // 調(diào)試程序時的工作目錄,一般為${fileDirname}即代碼所在目錄              "environment": [],            "externalConsole": true,            // 調(diào)試時是否顯示控制臺窗口,一般設(shè)置為 true 顯示控制臺              "MIMode": "gdb",            "miDebuggerPath": "D:/software/mingw64/bin/gdb.exe",   // miDebugger 的路徑,注意這里要與 MinGw 的路徑對應(yīng)              "preLaunchTask": "gcc",             // 這里需要添加一個參數(shù),                                                // 調(diào)試會話開始前執(zhí)行的任務(wù),一般為編譯程序,c++為 g++, c 為 gcc              "setupCommands": [                {                    "description": "為 gdb 啟用整齊打印",                    "text": "-enable-pretty-printing",                    "ignoreFailures": true                }            ]        }    ]}

接著,我們切換回“main.c”,再點擊調(diào)試代碼,此時 VSCode 就可以正常進(jìn)入調(diào)試界面了。如圖 6 所示。

圖 6 VSCode 調(diào)試界面

相關(guān)推薦

電子產(chǎn)業(yè)圖譜