一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

VSCode自制的IDE編譯多個(gè)源文件

 樂創(chuàng)客搬運(yùn)工 2021-01-27

文/Edward


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


   VSCode的預(yù)定義變量

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

圖1 task.json

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

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

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

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

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

再仔細(xì)觀察圖1,我們發(fā)現(xiàn)其中很多字段對應(yīng)的變量是以“${變量名}”形式出現(xiàn)的,這些變量名其實(shí)在VSCode中是被事先定義好的,有點(diǎn)類似于我們操作系統(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} -啟動(dòng)時(shí)任務(wù)運(yùn)行程序的當(dāng)前工作目錄

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

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

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

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

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

   編譯多個(gè)源文件

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

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

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

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

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

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

圖3 編譯輸出錯(cuò)誤

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

圖4 task.json

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

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

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

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产一区二区在线免费| 91精品蜜臀一区二区三区| 欧美一区二区三区不卡高清视| 邻居人妻人公侵犯人妻视频| 国产熟女一区二区三区四区| 国产精品夜色一区二区三区不卡| 不卡一区二区在线视频| 成人午夜激情在线免费观看| 久久精品少妇内射毛片| 人妻内射精品一区二区| 亚洲国产成人av毛片国产| 欧美一区二区黑人在线| 日韩欧美黄色一级视频| 亚洲一区二区三区国产| 亚洲一区二区三区中文久久| 能在线看的视频你懂的| 91人妻人人揉人人澡人| 欧美日韩最近中国黄片| 欧美日韩亚洲综合国产人| 国产精品久久精品毛片| 五月天丁香婷婷狠狠爱| 欧美成人一区二区三区在线 | 国产精品免费不卡视频| 又色又爽又无遮挡的视频| 91麻豆视频国产一区二区| 中文字幕无线码一区欧美 | 人妻少妇久久中文字幕久久| 欧美一区日韩二区亚洲三区| 国产一级不卡视频在线观看| 女人高潮被爽到呻吟在线观看| 妻子的新妈妈中文字幕| 青青操视频在线观看国产| 国产亚洲精品岁国产微拍精品| 中文字幕日韩欧美一区| 亚洲一级在线免费观看| 亚洲中文字幕综合网在线| 2019年国产最新视频| 老司机精品线观看86| 欧美日韩久久精品一区二区| 日韩一区二区三区嘿嘿| 91欧美日韩一区人妻少妇|