0. 前言
本文面向初學者窒朋,但是不適合還在學寫Hello World級別的初學者。閱讀本文能在一定程度上了解程序編譯的知識蝗岖,以及使用VS Code的知識侥猩。
本文大部分內(nèi)容都可從VS Code官方文檔:C++ programming with Visual Studio Code以及各個擴展的文檔中獲得,并且他們還會進行更新(本文也進行過幾次重大更新)抵赢。如果你想更深入了解欺劳,可以去看。其實本文基本上是由不斷地嘗試得出來的铅鲤,如果有錯誤可以指出划提。
我的環(huán)境:64位Windows 10。32位Win在某些地方需要修改邢享,不過本文沒有提鹏往;Linux下也有許多不同,僅供參考驼仪。
最終效果:實時顯示編譯階段的錯誤掸犬、格式化代碼、進行單文件的編譯與調(diào)試绪爸。
1. 環(huán)境的準備
VSC的官網(wǎng)、下載宙攻、安裝奠货,我就不多說了。VSC只是一個編輯器(editor)座掘,不是IDE(集成開發(fā)環(huán)境)递惋,不含編譯器(compiler)和許多其它功能柔滔,所以編譯器要自己裝好。
其實MinGW和MinGW-w64只是名字像萍虽,它們是兩個不同的項目睛廊。為了方便,本文中的MinGW指的其實都是MinGW-w64杉编。MinGW本身已經(jīng)很久沒有更新了超全,故不推薦。下載以下兩個程序(都要):
LLVM Download Page在此頁面下載Clang邓馒。選 Pre-Built Binaries 中的 Windows (64-bit)嘶朱,不需要下.sig文件
MinGW-w64 - for 32 and 64 bit Windows在此頁面下載 MinGW-w64,往下稍微翻一下光酣,選最新版本中的x86_64-posix-seh疏遏。最好不要用 Download Latest Version,這個是在線安裝包救军,有可能因為國內(nèi)的“網(wǎng)絡環(huán)境”下載失敗财异。如果瀏覽器還是下載失敗就換迅雷下,還失敗唱遭,那就使用能訪問Google的那種方法下宝当。
安裝Clang:添加環(huán)境變量時,選Add LLVM to the system PATH for all users(即第二項胆萧,不過第三項也差不多)庆揩;路徑我填的是C:\LLVM,也可以保持默認或者自己改跌穗。
安裝MinGW-w64:下下來的是一個7z的壓縮包订晌,隨便解壓到哪,把東西全部復制(或者直接剪切)到Clang的文件夾里去(除非你有自己的想法)蚌吸,它們會無沖突合并锈拨,然后就可以把它刪了:
驗證
運行cmd,輸clang或gcc羹唠,應該會提示no input files而不是“不是內(nèi)部命令或外部命令”或者“無法將“clang”項識別為 cmdlet奕枢、函數(shù)、腳本文件或可運行程序的名稱”佩微,見下圖缝彬。如果是“不是內(nèi)部命令或外部命令”,說明clang.exe在的文件夾(我圖里的是C:\LLVM\bin)沒有在環(huán)境變量中哺眯,要加到Path里才行谷浅。如果加了還是這樣腾务,重啟泥耀。
輸clang -v或gcc -v可以顯示出各自的版本。如果顯示出來的版本與你剛下的不同/更老,說明Path里原本有老版本的編譯器握爷,可能是安裝其它IDE時裝上的锤躁。則需要去掉原來的粘舟。
這兩項驗證一定要符合宫盔。如果你不知道怎么修改環(huán)境變量可以自己百度或者b站搜“環(huán)境變量”看視頻(大多不是C的但是區(qū)別不大)。
輸入gcc -v的最后一行輸出眉睹,版本要和你自己下的對應荔茬,要有x86_64和seh;sjlj是以前的辣往,圖懶得改了
安裝擴展(extension)
必裝:
C/C++:又名 cpptools兔院,提供Debug和Format功能
C/C++ Clang Command Adapter:提供靜態(tài)檢測(Lint)功能
Code Runner:右鍵即可編譯運行單文件,很方便站削;但無法Dubug
其他可選擴展:
Bracket Pair Colorizer:彩虹花括號
Include Autocomplete:提供頭文件名字的補全坊萝,不過用處不大;而且其實現(xiàn)在cpptools已經(jīng)自帶這個功能了许起,但本文不使用它的補全
C/C++ Snippets:Snippets即重用代碼塊十偶,效果自己百度;這個擴展安裝量雖高园细,不過個人感覺用處實在不大惦积,你也可以選擇其他的Snippets擴展甚至自己定義
One Dark Pro:大概是VS Code安裝量最高的主題
vscode-clangd:這個和Adapter二選一,出得比Adapter晚猛频,下載量也低狮崩,但卻是llvm官方出的。出現(xiàn)問題時可以換著試試
Clang-Format:只有想自定義代碼風格時才裝鹿寻,比如大括號不換行睦柴。需要另外學習如何使用
不建議/不需要裝的擴展:
GBKtoUTF8:把GBK編碼的文檔轉(zhuǎn)換成UTF8編碼的。此擴展可能有嚴重的bug毡熏。
C++ Intellisense:用的是gtags坦敌,本文第一個版本的選擇。效果非常非常一般痢法。
FAQ
Q: 為什么要裝Clang?
A: 錯誤提示更友好狱窘。以及:Clang 比 GCC 好在哪里?
Q: Clang怎么讀财搁?
A: 正確答案是/?kl??/蘸炸,即c發(fā)"可"的音;不過實際還是以雙方都理解為基礎妇拯,比如平常把SQL說成circle也是能理解的
Q: 為什么既要裝Clang又要裝MinGW?
A: Clang沒有stdio.h等頭文件幻馁。至于為什么沒有洗鸵,我就不知道了越锈;也許就是下一點的原因
Q: MSVC integration install failed / unable to find a Visual Studio installation...
A: Win下的Clang默認用的是MSVC的后端仗嗦。如果完全按照本文接下來的操作,不用管這個提示
2. 配置四個.json文件
先創(chuàng)建一個你打算存放代碼的文件夾(稱作工作區(qū))甘凭,路徑不能含有中文和引號稀拐,最好不要有空格。C和C++需要分別建立不同的工作區(qū)丹弱,除非你懂得下面json文件的某些選項德撬,則可以做到一個工作區(qū)使用不同的build task。
打開VSC躲胳,選打開文件夾蜓洪,不要選“添加工作區(qū)文件夾”,理由見上一句坯苹。點新建文件夾隆檀,名稱為.vscode。這樣操作的原因是Windows的Explorer不允許創(chuàng)建的文件夾第一個字符是點(但據(jù)說1809的下一個大版本支持了)粹湃。然后創(chuàng)建 launch.json恐仑,tasks.json,settings.json为鳄,c_cpp_properties.json放到.vscode文件夾下裳仆,效果圖:
復制以下代碼出來后,知乎會自動在前面加上幾行保留所有權利的字孤钦,實際使用的時候肯定要刪了的歧斟。每個小節(jié)的開頭都有選項說明。特別提示:默認F5只能編譯C偏形,如果你要調(diào)試C++静袖,必需改tasks.json,具體參見小節(jié)說明壳猜。
launch.json代碼
stopAtEntry和externalConsole可根據(jù)自己喜好修改勾徽;cwd可以是程序運行時的相對路徑,如有需要可以改為${fileDirname}统扳;現(xiàn)在的LLVM帶有l(wèi)ldb-vscode這個程序喘帚,但我沒試過能不能用。其他無需更改咒钟。type和request不變色是正炒涤桑現(xiàn)象。
//https://github.com/Microsoft/vscode-cpptools/blob/master/launch.md
{
"version":"0.2.0",
"configurations":[
{
"name":"(gdb) Launch",//配置名稱朱嘴,將會在啟動配置的下拉菜單中顯示
"type":"cppdbg",//配置類型倾鲫,這里只能為cppdbg
"request":"launch",//請求配置類型粗合,可以為launch(啟動)或attach(附加)
"program":"${fileDirname}/${fileBasenameNoExtension}.exe",//將要進行調(diào)試的程序的路徑
"args":[],//程序調(diào)試時傳遞給程序的命令行參數(shù),一般設為空即可
"stopAtEntry":false,//設為true時程序?qū)和T诔绦蛉肟谔幬谖簦喈斢谠趍ain上打斷點
"cwd":"${workspaceFolder}",//調(diào)試程序時的工作目錄隙疚,此為工作區(qū)文件夾;改成${fileDirname}可變?yōu)槲募谀夸?/p>
"environment":[],//環(huán)境變量
"externalConsole":true,//為true時使用單獨的cmd窗口磕道,與其它IDE一致供屉;18年10月后設為false可調(diào)用VSC內(nèi)置終端
"internalConsoleOptions":"neverOpen",//如果不設為neverOpen,調(diào)試時會跳到“調(diào)試控制臺”選項卡溺蕉,你應該不需要對gdb手動輸命令吧伶丐?
"MIMode":"gdb",//指定連接的調(diào)試器,可以為gdb或lldb疯特。但我沒試過lldb
"miDebuggerPath":"gdb.exe",//調(diào)試器路徑哗魂,Windows下后綴不能省略,Linux下則不要
"setupCommands":[//用處未知漓雅,模板如此
{
"description":"Enable pretty-printing for gdb",
"text":"-enable-pretty-printing",
"ignoreFailures":false
}
],
"preLaunchTask":"Compile"http://調(diào)試會話開始前執(zhí)行的任務录别,一般為編譯程序。與tasks.json的label相對應}]}
tasks.json代碼
如果是編寫C++故硅,編譯器需改成clang++庶灿;如果想用MinGW就分別是gcc和g++,但注意把--target那條刪去吃衅。
如果不想要額外警告往踢,把-Wall那一條刪去。
reveal可根據(jù)自己喜好修改徘层,即使設為never峻呕,也只是編譯時不跳轉(zhuǎn)到“終端”而已,手動點進去還是可以看到趣效,我個人設為never瘦癌。
參數(shù)的作用我加了注釋,還看不懂跷敬,百度gcc使用教程讯私。
//https://code.visualstudio.com/docs/editor/tasks
{
"version":"2.0.0",
"tasks":[
{
"label":"Compile",//任務名稱,與launch.json的preLaunchTask相對應
"command":"clang",//要使用的編譯器西傀,C++用clang++斤寇;如果編譯失敗,改成gcc或g++試試拥褂,還有問題那就是你自己的代碼有錯誤"
args":[
"${file}",
"-o",//指定輸出文件名娘锁,不加該參數(shù)則默認輸出a.exe,Linux下默認a.out
"${fileDirname}/${fileBasenameNoExtension}.exe",
"-g",//生成和調(diào)試有關的信息
"-Wall",//開啟額外警告
"-static-libgcc",//靜態(tài)鏈接libgcc
"--target=x86_64-w64-mingw",//clang的默認target為msvc饺鹃,不加這一條就會找不到頭文件莫秆;Linux下去掉這一條
"-std=c11"http://C++最新標準為c++17间雀,或根據(jù)自己的需要進行修改
],//編譯命令參數(shù)
"type":"process",//process是vsc把預定義變量和轉(zhuǎn)義解析后直接全部傳給command;shell相當于先打開shell再輸入命令镊屎,所以args還會經(jīng)過shell再解析一遍
"group":{
"kind":"build",
"isDefault":true//設為false可做到一個tasks.json配置多個編譯指令惹挟,需要自己修改本文件,我這里不多提},
"presentation":{
"echo":true,
"reveal":"always",//在“終端”中顯示編譯信息的策略杯道,可以為always匪煌,silent责蝠,never党巾。具體參見VSC的文檔
"focus":false,//設為true后可以使執(zhí)行task時焦點聚集在終端,但對編譯c和c++來說霜医,設為true沒有意義
"panel":"shared"http://不同的文件的編譯信息共享一個終端面板
}
//"problemMatcher":"$gcc"http://如果你不使用clang齿拂,去掉前面的注釋符,并在上一條之后加個逗號肴敛。照著我的教程做的不需要改(也可以把這行刪去)
}
]
}
settings.json代碼
把這個文件里的東西放到“用戶設置”里也可以覆蓋全局設置署海,自己進行選擇。
Code Runner的命令行和某些選項可以根據(jù)自己的需要在此處修改医男,用法還是參見此擴展的文檔和百度gcc使用教程砸狞。Win7需要用注釋掉的命令行,或者把terminal.integrated.shell.windows改為PowerShell镀梭。
如果你要使用其他地方的頭文件和庫文件刀森,需要要往clang.cflags和clang.cxxflags里加-I、-l和-L报账,用法百度gcc使用教程研底。
clang的補全,在我過去的測試過程中會讓VSC非惩赴眨卡榜晦,但是現(xiàn)在好像沒有這個問題了。如果你卡羽圃,就把clang的補全關掉乾胶,用cpptools的(不需要我指明分別是哪兩個吧?)朽寞。
Linux下記得去掉code runner和flags的--target识窿,共四個。
提到的snippetSuggestions愁憔。
{
"files.defaultLanguage":"c",//ctrl+N新建文件后默認的語言
"editor.formatOnType":true,//輸入時就進行格式化腕扶,默認觸發(fā)字符較少,分號可以觸發(fā)
"editor.snippetSuggestions":"top",//snippets代碼優(yōu)先顯示補全
"code-runner.runInTerminal":true,//設置成false會在“輸出”中輸出吨掌,無法輸入
"code-runner.executorMap":{
"c":"cd $dir && clang '$fileName' -o '$fileNameWithoutExt.exe' -Wall -g -O2 -static-libgcc --target=x86_64-w64-mingw -std=c11 && &'$dir$fileNameWithoutExt'",
"cpp":"cd $dir && clang++ '$fileName' -o '$fileNameWithoutExt.exe' -Wall -g -O2 -static-libgcc --target=x86_64-w64-mingw -std=c++17 && &'$dir$fileNameWithoutExt'"
//"c":"cd $dir && clang $fileName -o $fileNameWithoutExt.exe -Wall -g -O2 -static-libgcc --target=x86_64-w64-mingw -std=c11 && $dir$fileNameWithoutExt",
//"cpp":"cd $dir && clang++ $fileName -o $fileNameWithoutExt.exe -Wall -g -O2 -static-libgcc --target=x86_64-w64-mingw -std=c++17 && $dir$fileNameWithoutExt"},
//控制coderunner命令半抱;未注釋的僅適用于PowerShell(Win10默認)脓恕,注釋掉的適用于cmd(win7默認)
"code-runner.saveFileBeforeRun":true,//runcode前保存
"code-runner.preserveFocus":true,//若為false,runcode后光標會聚焦到終端上窿侈。如果需要頻繁輸入數(shù)據(jù)可設為false
"code-runner.clearPreviousOutput":false,//每次runcode前清空屬于coderunner的終端消息
"code-runner.ignoreSelection":true,//默認為false炼幔,效果是鼠標選中一塊代碼后可以單獨執(zhí)行,但C是編譯型語言史简,不適合這樣用
"C_Cpp.clang_format_sortIncludes":true,//格式化時調(diào)整include的順序(按字母排序)
"C_Cpp.intelliSenseEngine":"Default",//可以為Default或TagParser乃秀,后者較老,功能較簡單圆兵。具體差別參考cpptools擴展文檔
"C_Cpp.errorSquiggles":"Disabled",//因為有clang的lint跺讯,所以關掉
"C_Cpp.autocomplete":"Disabled",//因為有clang的補全,所以關掉
"clang.cflags":[//控制c語言靜態(tài)檢測的參數(shù)
"--target=x86_64-w64-mingw",
"-std=c11",
"-Wall"
],
"clang.cxxflags":[//控制c++靜態(tài)檢測時的參數(shù)
"--target=x86_64-w64-mingw",
"-std=c++17",
"-Wall"
],
"clang.completion.enable":true//效果比cpptools要好
}
c_cpp_properties.json代碼
如果你確定不需要使用別人的庫殉农,則現(xiàn)在的版本不需要創(chuàng)建這個文件了刀脏,擴展會自動使用默認的設置。
如果你自己編寫了頭文件又不在workspaceFolder下超凳,或是使用別人的庫愈污,路徑就要加到includePath和browse里(不過還有別的操作要做,見下一大點的多文件編譯)轮傍。如果需要遞歸包含暂雹,末尾加/**
此文件內(nèi)容來自于Microsoft/vscode-cpptools;這個json不允許有注釋(其實按照標準本來就不能有)创夜。
如果沒有合并Clang和MinGW杭跪,則該文件中的compilerPath必需修改成MinGW的完整路徑,精確到gcc.exe挥下,否則會提示找不到頭文件揍魂;Linux下是/usr/bin/gcc。
Windows下的目錄分隔符為反斜杠棚瘟,原本應使用兩個反斜杠來轉(zhuǎn)義现斋,但直接用斜杠在VS Code中也接受。
When you set thecompilerPathproperty and changeintelliSenseModetoclang-x64(orgcc-x64in version 0.18.0 and higher), you no longer need to copy the system include path or defines toincludePath,browse.path, ordefinesto enable IntelliSense to work properly.
{
"configurations":[
{
"name":"MinGW",
"intelliSenseMode":"gcc-x64",
"compilerPath":"C:/LLVM/bin/gcc.exe",
"includePath":[
"${workspaceFolder}"
],
"defines":[],
"browse":{
"path":[
"${workspaceFolder}"
],"limitSymbolsToIncludedHeaders":true,
"databaseFilename":""
},
"cStandard":"c11",
"cppStandard":"c++17"
}
],
"version":4
}
為什么要往json里寫這么多的東西偎蘸?因為VSC本身并沒有對C語言特別優(yōu)待庄蹋,對其他許多語言也是這樣。以$開頭的是VSC預定義的變量迷雪,具體參見:Variables Reference限书,比如$file在實際運行時會替換成當前打開的文件名。
3. 寫代碼章咧,編譯倦西,調(diào)試
新建文件后就可以寫代碼了,c語言源代碼后綴是.c赁严,c++是.cpp或.C或.cxx(這也要我教嗎……)扰柠。代碼文件在保存工作區(qū)內(nèi)都可以粉铐,可以自己建立文件夾,不必放到.vscode文件夾里卤档,不要含有中文和引號蝙泼,最好不要有空格;主要是許多符號是有效的shell語法劝枣,不然試試用rm刪除一個叫做-rf的文件汤踏?
按Alt+Shift+F(或者右鍵菜單)可以格式化代碼。出現(xiàn)Intellisense的時候按tab可以補全代碼舔腾。
停止輸入一小段時間(一秒)后就會有Lint溪胶,擴展會給一些建議性的warning(比如聲明了變量但不使用),自己清楚就行琢唾。如果覺得不爽载荔,也有方法不讓它提示,比如去掉-Wall就會少一些采桃。如果還想去掉更多的警告,自己找怎么做丘损,我提示一下:-Wno-...普办。找好參數(shù)后加到clang.cflags、clang.cxxflags和tasks.json的args里徘钥。
按ctrl+shift+B單純編譯衔蹲,按F5為運行并調(diào)試(運行前會自動編譯);本來ctrl+F5為運行但不調(diào)試呈础,但是在cpptools暫不支持舆驶,還是會調(diào)試。Follow:How to launch an application without debugging? · Issue #1201 · Microsoft/vscode-cpptools
在寫程序初期而钞,我強烈建議不要把f5當作編譯來使用沙廉,因為有的bug只會產(chǎn)生警告,不會阻止編譯臼节,但這些東西越早期解決越好撬陵。編譯信息會在底下的“終端”面板里,如果代碼有錯誤网缝,點進去可以看clang報的信息巨税,但因為有Lint了,所以可以輕松很多粉臊。
加斷點在列號前面點一下就行草添,如果想從一開始就停下來,可以加在main函數(shù)那里扼仲,或者launch.json中設置"stopAtEntry": true远寸。按f11可以一步一步進行促王,箭頭所指的那行代碼就是下一步要運行的代碼。左邊有個調(diào)試欄而晒,可以看到變量的值,自動欄沒有的可以手動添加表達式蝇狼;把鼠標放到變量上可以看到變量的值,但是只能識別簡單的表達式倡怎;棧幀對于觀察遞歸很有用迅耘;在某些時候還可以抓取“異常”监署。
快捷鍵:vscode: Visual Studio Code 常用快捷鍵颤专。英文文檔中當然有快捷鍵的信息,還有Cheet Sheet可以看钠乏,而且英文文檔會更新栖秕。這個單獨列出來還是給初學者吧。
中文亂碼見第六點晓避。其它錯誤先看底下的“某些可能出現(xiàn)的錯誤”以及看評論區(qū)簇捍。
Code Runner
如果你不需要調(diào)試,可以直接右鍵選run code俏拱,或者點右上角的播放按鈕暑塑。如果在終端里運行,可以輸入數(shù)據(jù)锅必,但是少了顯示時間的功能事格;在“輸出”中則上面兩項相反。
用它還可以在非工作區(qū)內(nèi)編譯運行程序搞隐,但executorMap記得放到全局設置里驹愚。在終端中按ctrl + c可以終止程序運行。
如果按照我的配置劣纲,task和code runner還有一點不同的是working directory逢捺。前者是你打開的文件夾,后者是文件所在的文件夾味廊。當然它們也都可以自己修改蒸甜。
其實Code Runner只是代替你手動輸命令,功能并不強余佛,算是適用場景不同吧柠新。不要以為run code跑個Hello World很簡單,Code Runner就很強辉巡,前面那么多配置都是垃圾了恨憎。
另外,樓下的答主韓駿就是此插件作者,有事統(tǒng)統(tǒng)找他(滑稽)憔恳。
多文件編譯
如果你想進行少量的多文件編譯瓤荔,C語言直接用gcc 源文件1.c 源文件2.c 頭文件1.h這樣就好,C++類似钥组,其余選項百度gcc怎么用输硝。 如果需要多次編譯可以寫一個批處理。
如果你想進行大量的多文件編譯程梦,請學習如何寫makefile或使用cmake点把。
如果你想使用別人的庫,比如ffmpeg屿附,可能需要在命令中指定-I郎逃、-l(小寫的L)、-L挺份。具體閱讀那個庫的文檔褒翰。
這些情況下可以考慮單獨建一個工作區(qū),不要和單文件編譯的共用匀泊;還可能需要需要修改那幾個JSON來配置Intellisense优训。
其實不新建工程(Project)、只是單文件就能調(diào)試探赫,是不利于以后使用和理解大型IDE的型宙。不過初學也不用掌握那么多,不要覺得建工程很麻煩伦吠、不建工程就能編譯很強就是了。
總之這個VSC無關魂拦,用其它IDE或是手動編譯還是會遇到差不多的問題毛仪。自行解決。
保存文件夾
如果你用VSC還做別的事(比如寫前端)芯勘,或者有不止一個工作區(qū)箱靴,可以創(chuàng)建一個快捷方式(右鍵新建),把工作區(qū)路徑作為參數(shù)傳給VSC主程序荷愕,還可以加個圖標衡怀。這操作不難,記得打雙引號就行安疗。1.18有了一個窗口多個工作區(qū)的功能抛杨,“文件”菜單里也有“保存工作區(qū)”這個功能,但是我沒試過荐类。
某些可能出現(xiàn)的錯誤
如果你只寫了個hello world怖现,不加任何斷點,按f5以后黑框框一閃而過是正常現(xiàn)象屈嗤。想讓程序暫停運行可以在末尾加上一個或兩個getchar();潘拨,不明白為什么有時要用兩個?去問你們C語言老師饶号;或用system("pause")铁追,或加斷點
如果你要進行調(diào)試,不要開優(yōu)化茫船。gcc用-Og還可以保留一些調(diào)試信息琅束,但clang用了以后就不能用gdb調(diào)試了。即使如此我還是在某一次寫代碼的時候遇到了無法跳入函數(shù)的問題透硝,而VS可以跳入
重命名文件后狰闪,原來已有的Lint還會在問題欄里;修改了文件后斷點可能會失效濒生。以及還存在一些其他的像這樣的小bug埋泵,一般關掉VSC再開就行
preLaunchTask“Compile”已終止,退出代碼為 1:編譯有error并且你用的是F5運行的就會有這個提示罪治;如果你點仍然調(diào)試丽声,就會調(diào)試上一次編譯成功的文件。其實所有的編譯失敗都會觸發(fā)這個錯誤觉义,出錯的返回值是1難道不是常識雁社?所以僅僅告訴我出現(xiàn)了這個提示根本沒用,因為它的意思就是出錯了晒骇,沒有人能看出原因霉撵。這也是為什么我要強烈建議不要把F5當作編譯來使用,按F5出了問題洪囤,我根本看不出是編譯期有問題還是調(diào)試期有問題徒坡,或是你自己的代碼有問題
終端將被任務重用,按任意鍵關閉:聽過“按任意鍵繼續(xù)”嗎瘤缩?這句話就是這個意思喇完。這句話比上面那個退出代碼為1還要沒用,它根本就不包含任何有效信息剥啤,無論成功還是出錯都會顯示它锦溪。所以不要再問這句話“怎么辦”了,先學學如何提問
無法打開...府怯,找不到文件(file:///build/glibc-OTsEL5/glibc-2.27/...):我在Linux下遇到了這個問題刻诊,下一個glibc放到指定位置就行,wget http://ftp.gnu.org/gnu/glibc/glibc-2.27.tar.xz富腊,剩下的就不要問我了坏逢。或者參見這個:Disable "Unable to open file" during debug · Issue #811 · Microsoft/vscode-cpptools
libmingw32.a(lib64_libmingw32_a-crt0_c.o):crt0_c.c:(.text.startup+0x2e): undefined reference to 'WinMain':這是你自己的代碼有問題,沒寫main函數(shù)是整,或者把main寫成了mian
undefined reference to xxx ... linker command failed:調(diào)用了未聲明的函數(shù)肖揣。可能是函數(shù)名打錯了浮入,或者沒有include頭文件龙优。總之是你自己的代碼有錯誤事秀。
ld: cannot open output file ... permission denied:原程序仍在運行(比如死循環(huán))彤断,無法被覆蓋,任務管理器結束那個進程即可
MinGW下易迹,監(jiān)視(Watch)窗口里用strcmp比較中文宰衙,會導致程序崩潰退出。只比較英文就沒事睹欲;Linux下無此現(xiàn)象
如果還有問題供炼,可以試試改成gcc/g++編譯。比如現(xiàn)在#include <bits/stdc++.h>會報'float.h' file not found窘疮,改成g++后就好了袋哼。我覺得這應該是庫的bug,反正我是不知道怎么解決
4. 其他設置
我的一些其他的設置闸衫,用在全局settings.json里涛贯,根據(jù)自己的情況調(diào)整,不需要全部照著我的寫蔚出。寫完一個以后要打逗號弟翘。
現(xiàn)在的VSC用的是可視化的設置界面,其實原本是手動編輯且出現(xiàn)兩列設置的骄酗。點擊右上角那個花括號就能手動編輯衅胀。
"editor.fontFamily":"等距更紗黑體 SC",//控制編輯器字體
"workbench.colorTheme":"One Dark Pro",//主題
"files.trimTrailingWhitespace":true,//保存時,刪除每一行末尾的空格
"files.insertFinalNewline":true,//保存后文件最末尾加一行空格
"workbench.colorCustomizations":{
"activityBar.foreground":"#39C5BB"http://自定義顏色
},
"git.enabled":false,//如果你不用git酥筝,可以考慮關閉它
"git.ignoreMissingGitWarning":true,//同上
"editor.minimap.enabled":false,//我個人不用minimap,就是右邊那個東西
"editor.dragAndDrop":false,//選中文字后雏门,可以拖動它們調(diào)整位置嘿歌。我是不需要
"files.autoGuessEncoding":false,//啟用后,會在打開文件時嘗試猜測字符集編碼茁影。我關閉的理由見5
"[c]":{//"files.encoding":"gbk"http://這樣的格式可以對指定后綴的文件應用設置宙帝,如果你實在想用gbk,就這樣設置吧募闲。cpp同理步脓。},
"window.zoomLevel":0.2,//整體放大
"workbench.settings.useSplitJSON":true,//恢復手動編輯時的兩列設置
更紗黑體是樓下B神做的字體,特點是標點好看(誤):be5invis/Sarasa-Gothic
Consolas雖然是Windows自帶字體中還算行的,但它只有英文字體靴患;微軟雅黑雖然是非襯線字體仍侥,但它不是等距的,這一點非常不適合編程鸳君,等線也不等距农渊;中易宋體……告辭。不下新的字體或颊,其他兩大系統(tǒng)我不清楚砸紊,Windows下簡直沒有編程可用的字體。Consolas加雅黑嘛囱挑,也還行吧醉顽,不過能用更好的干嘛不用呢。
5. 關于中文和亂碼
VS Code輸出中文會出現(xiàn)亂碼平挑,很多人都遇到過游添。這是因為VS Code內(nèi)部用的是utf-8編碼,cmd/PowerShell是gbk編碼弹惦。直接編譯否淤,會把“你好”輸出成“浣犲ソ”。如果把cmd的活動代碼頁改成65001棠隐,會出現(xiàn)漢字只能顯示一半的問題石抡,而且怎么修改成UTF8還是個問題。Linux就沒有這個問題助泽。
原本的解決方法是使用gcc啰扛,編譯時用-fexec-charset=GBK這個參數(shù),生成的程序就是GBK編碼的嗡贺。但是隐解,clang的execution-charset supports only UTF-8。所以诫睬,生成的程序在cmd/ps以及VS Code的終端(其實也是powershell)中運行煞茫,輸出中文還是會亂碼;但是在VS Code的“輸出”中就是正常的摄凡。如果想解決這個問題续徽,可以百度“寬字符輸出”,或者自己手動在cmd里用gcc加上上面那個參數(shù)編譯一遍(可以寫個批處理)亲澡,或者就直接改成用gcc編譯钦扭,clang來lint算了。
如果是打開已有的以GBK編碼的文件床绪,VS Code默認會以UTF-8編碼打開(除非你設置了猜測編碼)客情,這樣編輯器內(nèi)的中文就會亂碼哩照,不過對于初學C的同學來說购桑,寫的代碼一般只有注釋是中文窑眯。此時要點右下角的GBK获黔,選“通過編碼重新打開”,選UTF-8即可概页。GBKtoUTF8這個擴展籽御,理論上如果VSC檢測出的是GBK編碼的,它就會自動做“以UTF-8格式保存”這個操作惰匙;如果VSC沒有檢測出是GBK編碼技掏,它就什么也不會做。但是貌似它有bug项鬼,會把當前文件復制一遍插入到光標處哑梳,見VS code 很好用,但是有個惡心的bug绘盟,大家謹慎鸠真!大神幫解決一下,所以不推薦使用龄毡。
如果你沒有注意到一個GBK編碼的文件被VSC以UTF-8的編碼打開了吠卷,又進行了保存,按照我的測試沦零,這文件里的中文應該是找不回來了祭隔。這個還是比較危險的。而且如果打開了編碼猜測路操,VSC又猜錯了的話……所以我是關閉編碼自動猜測的疾渴。中文特別少的時候猜錯幾率很大。
這樣做了以后屯仗,在含有中文的路徑下可以編譯搞坝,但是仍然不能調(diào)試,所以還是把代碼放到不含中文的路徑中吧魁袜。如果把代碼文件發(fā)給其他用Windows的人桩撮,最好轉(zhuǎn)成gbk,否則別人用記事本打開有可能會亂碼(不過貌似1709改進了記事本的編碼猜測峰弹,1803的下一個版本連LF都支持了)距境。
6. 找不到頭文件的錯誤
有幾位同學遇到了路徑設置正確,編譯也通過垮卓,但是“問題"面板里出現(xiàn)找不到頭文件的error。我也遇到過师幕。這個error是cpptools報的粟按∥芴玻可能的解決方法是把你需要的頭文件的路徑加到c_cpp_properties.json中,或者你的compilerPath沒有設置正確灭将。如果還是解決不了疼鸟,反正不影響編譯,就當做沒看到算了庙曙。如果你遇到了又解決了可以留言告訴大家空镜。如果是非工作區(qū)選c語言或者c++,出現(xiàn)這個錯誤很正常捌朴,因為不滿足前提:路徑設置正確(沒有c_cpp_properties.json)吴攒。
另一種問題:
如果是這個錯誤,這是因為clang的默認target為msvc砂蔽,需要加--target=x86_64-w64-mingw這個參數(shù)才行洼怔。這個默認target貌似是寫死在源代碼里的,反正我找了一圈是沒找到正常修改辦法左驾,下載clang的源代碼镣隶,自己改掉,再編譯clang本身诡右,也許可以解決安岂。或者裝Windows sdk而不使用mingw帆吻,這樣就符合默認target了域那,參考第九點。當然最簡單的辦法就是用gcc桅锄。
7. 其他
按照這樣配置琉雳,長期編譯代碼下來肯定有一大堆的exe,還可能分散在不同的文件夾里友瘤。你可以考慮修改一下json文件翠肘,把生成文件的目錄指定到一個專門放exe的文件夾里(如果不會,百度gcc使用教程)辫秧∈叮或者資源管理器右上角搜索*.exe,就可以搜出它們盟戏⌒髅茫或者寫個bat刪了。都很簡單柿究。
json是一種數(shù)據(jù)交換格式邮旷,<del>大部分是JavaScript的子集</del>現(xiàn)在強行變成完全子集了,數(shù)據(jù)冗余度小蝇摸。VSC和各個擴展會讀取json中的條目婶肩,來決定某些功能的行為办陷。這么多條目哪里來的呢?這其實和API差不多律歼。擴展開發(fā)者會把允許修改的選項“告訴”VSC民镜,各個擴展的安裝頁面都有寫,VSC又有intellisense险毁,所以其實很容易寫制圈。如果是單純使用json,我覺得就算從來沒有見過畔况,邊看邊猜也能寫個大概鲸鹦。又因為擴展開源,你甚至可以去擴展的github頁面和開發(fā)者聊天问窃。
Windows 10亥鬓,默認輸入法只有一個微軟拼音,按一次shift就能進行中英轉(zhuǎn)換域庇,而為了保持兼容嵌戈,按ctrl加空格也能進行中英轉(zhuǎn)換,而這個快捷鍵正是強制觸發(fā)Intellisense的快捷鍵听皿。所以熟呛,我強烈建議手動添加“英語”語言輸入法,寫非前端代碼時切換到純英文輸入法(win+空格)尉姨。這樣也可以解決某些游戲需要用到shift鍵但是同樣快捷鍵沖突的問題庵朝。
tasks.json中的"problemMatcher":"$gcc"會解析終端中的錯誤提示,因為已經(jīng)有Clang的Lint了又厉,就不需要這個九府;如果用了Clang Command Adapter又打開這個,則會出現(xiàn)雙重錯誤提示覆致。本來1.11就說可以寫$gcc的侄旬,但當時其實并不支持,現(xiàn)在早就能用了煌妈。不過如果要用非預設版本儡羔,就需要自己寫了。
此配置無法使用Bash for Windows或WSL璧诵,因為bash中的反斜杠會被識別為換行汰蜘。cpptools現(xiàn)為launch.json提供了一個Bash on Windows Launch的snippets,但是我沒有試過如何使用之宿。
8. 其他工具鏈的選擇
使用MinGW編譯但仍用Clang提供Lint:tasks.json的命令行自己改一改族操,code runner的命令行在settings.json里,自己改比被。這樣可以在終端中輸出不亂碼坪创,參考第六點炕婶。缺點:編譯用的不是Clang,編譯速度相對慢莱预。Lint可能提示的警告不全,比如Clang給出的"did you mean ..."提示项滑,Lint就可能捕獲不到
MinGW-w64 + 官方擴展:不使用Clang依沮。除了上面做的,tasks.json里problemMatcher打開枪狂;settings.json里的東西自己改一改危喉。缺點:Windows下的Lint效果真的真的很差,Linux稍微好一點州疾。感覺相比上一個方案沒有優(yōu)點辜限?
Windows SDK + 官方擴展:VS Installer選VC++工具集和一個完整的SDK(默認勾上的那個就是)即可。擴展用cpptools严蓖,c_cpp_properties.json可以自動化配置(ctrl+shift+p, edit configurations)薄嫡;另外兩個json也要改,VS的編譯器是cl颗胡,參數(shù)也要改毫深;調(diào)試器也許可以用VS的。不過這樣我覺得也許還不如直接用VS毒姨,而且我沒試過
如果以上都看不懂哑蔫,可以試試這個配置好的(不過人家的配置方法和我的不一樣):【VSCode】Windows下VSCode便攜式c/c++環(huán)境
如果不想用VSC寫了,可以看看這篇問題:毫無編程基礎的小白準備學習C語言弧呐,用VC6還是VS2015闸迷?
codeblocks現(xiàn)在還活著,配置一番(雖然同樣有點折騰)也可用俘枫。Clion界面美觀腥沽,功能應該也挺強,不過只有英文崩哩,剛上手用起來可能有點困難巡球,學生可以免費申請key,否則收費
9. 我編寫代碼的體驗
體積上邓嘹,合并后的llvm文件夾占1.6g酣栈,vsc 0.2g,加上一些擴展汹押。如果只是用來寫C矿筝,體積占用并不算小。內(nèi)存占用棚贾,如果VSC不出bug窖维,還是比較少的(0.5g左右)榆综。
VSC的第一優(yōu)勢也許是好看?雖然不是專門為C/C++設計的铸史,但它真的還有許多其它優(yōu)點鼻疮。光Lint這一點就比wintc、cfree琳轿、dev c++強了很多了判沟,更別提dev c++自己的Debug功能就有bug,還極其容易碰到崭篡。
我還有一點想對學生黨說:能自己百度到這篇文章挪哄,努力去看懂、動手配置琉闪,已經(jīng)比貼吧無數(shù)伸手黨和等著老師在qq群里發(fā)IDE的人強了很多了迹炼。另外如果有能力,我還是建議你們讀讀VSC的文檔:Documentation for Visual Studio Code颠毙,并不復雜斯入,體驗一下英語的實際應用也不錯哦。
附錄
送大家一份21天學通C++第8版 高清完整PDF 這是片段:
大家可以加qun獲取吟秩。