目的
使用集成開發工具visual studio寫c++程序的確方便,但是對於一般輕量的c++程序,特別是自己在跟着教程學習的過程中寫的一些練習的例子,沒必要每個工程都使用visual studio新建一個工程。
vs code作爲一款輕量級的編輯器,配合一系列插件也可以開發c++程序。但是第一次配置vs code的c++開發環境,還是花了我不少功夫的,主要是網上的教程大多都是基於vs code + mingW編譯器配置方案(我們安裝了visual studio,又何必多此一舉再去安裝別的編譯器?)。並且大多數都是翻譯官網的文檔,根本就配置不成功。
我們要開發c++程序,想必你的電腦已經安裝了vs studio,既然我們安裝了vs stdio,又何必多此一舉再去安裝mingW編譯器呢?本文從0到1教你如何結合vs code和vs studio的cl編譯器配置c++開發環境。
前提條件
- 安裝vs code;
- 安裝visual studio,版本隨意;
- 安裝c/c++插件;
前3步應該都沒有難度,如果這裏都搞不定的話,那你就在下面留言吧。
正文開始
假設我們暫時想使用vs code寫一個簡單的c++程序,按照如下流程:
-
新建文件夾
在任意位置新建一個文件夾,保存你的c++工程文件。比如我在桌面建立一個test文件夾,此時文件夾是空的,裏面什麼都沒有。 -
使用vs code打開文件夾
-
編寫c/c++代碼
點擊這裏,添加一個文件,比如我的是main.cpp文件,然後愉快地寫一個簡短的c++程序:
你這裏可能就會有問題了,比如提示找不到頭文件,不能智能提示,別急,慢慢往下看。 -
配置c_cpp_properities.json文件-----指定編譯器
到目前爲止,我們已經寫了一個cpp文件了,接下來就是各種配置,告訴vs code,使用什麼調試器和編譯器去編譯、鏈接我們這個cpp文件。首先要配置的就是c_cpp_properities.json文件。
使用快捷鍵:ctrl+shift+p打開命令面板,輸入c/c++(前提是你已經安裝了c/c++插件),選中Edit Configurations(JSON),然後vs code自動打開生成 .vscode文件夾,並在裏面生成c_cpp_properities.json文件,如下圖所示:
另外一個Edit Configurations(UI)其實也是配置c_cpp_properities.json的,只是以window ui的形式配置,更方便,配置完後也會自動生成c_cpp_properities.json文件
- 注意:
很多教程這裏都是說的模棱兩可的,都說如果沒有 .vscode文件夾就自己手動建一個,沒有各種json文件也是自己手動建。實際上是不需要的,vs code已經爲我們定義好了各種json的模板,打開命令面板,搜索關鍵詞就可以找到那些json文件模板,其也會自動爲我們生成 .vscode文件夾,根本不需要我們手動建立。
其中,比較重要的是你的編譯器路徑,vs code一般會自動填充你的編譯器路徑。有時候可能vs code找到的cl編譯器路徑不正確,此時我們要手動填充正確的編譯器路徑,否則,vs code沒辦法編譯你的cpp文件(vs code只是一款可以安裝插件的編輯器,本質上與Windows自帶的文本編輯器沒什麼不同,自身不能編譯源碼)。
如果你的電腦是x64位的,vs studio爲了能編譯32位的應用程序,一般會同時安裝32位的編譯器和64位的編譯器,遺憾的是這兩個編譯器的名字都是cl.exe,我們無法從名字上區分。一般而言,32位的編譯器就在vs的安裝目錄下的bin目錄下,而64位的編譯器安裝在bin目錄下的x64或者amd64文件夾下,一般我們選擇64位的編譯器。
其他的幾個字段,比如includePath,顧名思義是指定你當前工程的包含目錄,可使用絕對路徑,也可使用默認的相對路徑,如果你的代碼十分簡單,都可以刪除這個字段(包含路徑默認是當前文件夾,即使我們不顯示指定包含路徑,vs code也會在當前文件夾下搜索)。
- 配置task----告訴vs code編譯哪些文件
前面我們告訴了vs code使用cl.exe編譯器進行源碼編譯,還要告訴vs code要編譯哪些文件。tasks.json文件就是告訴vs code,我們要如何編譯cpp文件,編譯哪些cpp文件,編譯輸出是什麼等等。
還是打開vs code的命令面板,輸入task,選中Tasks:Configure Default Build Task,然後選擇c/c++:cl.exe build active file,如下圖所示:
選中task後,你的彈出來的選項可能與我這裏的不同,沒關係,隨便選一個就好了,一般選擇others,然後自動生成tasks.json文件,我們需要手動手動修改一些參數,如下圖所示:
一般你的生成的tasks.json文件與我的可能不同,沒關係,缺少的字段你按照我這裏的給補上去,多餘的你可以刪掉。這裏需要詳細講一下各個字段的含義,以及如何配置。
type:這裏一般爲shell,也許你的是echo,把它改爲shell;
label:沒什麼用,用默認的就好,這裏不需要改。這個label就是待會你打開vs code的命令面板,輸入label指定的名稱就會定位到這個文件。
command:告訴vs code,我們使用cl.exe編譯器,其路徑在前面的c_cpp_properities.json定義的。
args:編譯參數,前面三個參數一般不需要改,使用默認的就好,如果你不指定也可以,後面編譯的時候會警告,具體參數的含義可以去visual studio裏查看,都有的,比如Zi的含義如下圖所示:
main.exe是我自己寫的,表示此項目編譯輸出的可執行文件名稱是main.exe,如果你要編譯靜態庫,則應該寫成xxx.lib。
xxx.cpp:表示此項目編譯的cpp文件,如果你的只有一個main.cpp,則此處只需要添加main.cpp文件即可,總之,根據實際需要,需要編譯哪些cpp文件就增加哪些cpp文件即可。
其他字段:剩下的那些字段都是默認生成的,不需要管,如果你的沒有,你也可以不增加這些字段,但是上面的那些字段必須要有的。
- 配置launch----告訴vs code如何調用可執行文件
前面我們已經告訴vs code使用cl.exe編譯器去編譯指定的cpp文件,當編譯成功時,編譯器在當前文件夾下輸出一個我們指定的可執行文件。其實到這裏就已經完成了,不需要在配置其他的了。我們直接雙擊那個可執行文件就會得到程序輸出的結果了。
但是我們想讓vs code爲我們提供一條龍服務,既然已經生成了exe文件,我們要如何使用tasks.json幫助我們生成的文件呢,而launch.json文件就是幫助我們做這個事情的。
還是一如既往地打開命令面板,搜索關鍵詞:launch,選中launch.json,如下圖所示。
這裏比較簡單,就是告訴vs code,我們要調用哪個exe可執行文件,在program字段處填充我們要調用的可執行文件即可。注意,這裏的可執行文件應該是我們前面配置的tasks.json時指定的輸出文件。
type:c++文件必須是cppvsdbg,一般這裏默認就好;
request:我們是調用這個可執行文件,這裏填launch(launch有調用程序的意思,我們一般安裝完一個軟件後,都會有launch xxx);
stopAtEntry:在入口點停止,一般程序的入口點就是main函數,如果這裏填入true,則會在main函數那裏停止,相當於打一個斷點;
cwd:current working directory,當前工作路徑,默認就好;
externalConsole:外部控制檯,如果這裏爲true,則vs code會爲我們調用cmd作爲程序的輸出打印設備,一般我們默認使用vs code的控制檯就好;
- 編譯運行
所有配置都完成了,接下來就是編譯運行了。
編譯:快捷鍵:ctrl+shift+B,如果你的這個快捷鍵被win10的輸入法的emoj快捷鍵無情佔用,比如像我這樣的:
那就從命令面板中啓動調試吧,ctrl+shift+P,輸入關鍵詞task,找到Tasks:Run build task,如下圖所示。
編譯完後生成main.exe文件,如下圖所示。
運行:ctrl+F5,調用main.exe可執行文件,在vs code的控制檯輸出,如下圖所示。
錯誤處理
到目前爲止,爲了使用vs code爲我們編譯一個簡單的c++程序,我們做了太多的工作。這也是大部分教程講解vs code搭建c++編譯環境所講的內容,這裏我把配置每個json文件的目的都告訴你了,相信你有一個大致的瞭解了。
接下來纔是本文與其他的教程不一樣的地方,大部分教程到這裏就結束了,並且都是基於mingW編譯器的配置,然後正常編譯,執行,沒任何問題。可是如果你真的按照前面的步驟一步步來,我相信你的程序是不能正常編譯的。
cl.exe無法識別
第一個攔路虎就是編譯都不通過,如圖所示,提示無法識別cl.exe,出現這個問題是你沒有把cl.exe的路徑加到環境變量中。我們把cl.exe加到環境變量的path中就可以了,比如我的如下圖所示。
這裏cl編譯器路徑根據你實際的vs安裝位置確定,還要注意是32位的還是64位的。如果你的電腦是64位的,則添加64位的編譯器。
判斷編譯器是否添加到系統環境變量中的技巧
一般我們把cl編譯器加到環境變量中後,打開cmd,輸入cl,如果正常輸出編譯器的版本,則表明添加成功,如下圖所示。
找不到頭文件
我們在配置c_cpp_properities.json的時候並沒有指定比如iostream等系統頭文件,導致vs code識別不到iostream。
解決這個問題很簡單,要麼在c_cpp_properities.json的includePath字段指定頭文件,要麼在系統環境變量中添加頭文件搜索路徑。在c_cpp_properities.json添加頭文件路徑,需要每個項目都要添加一遍,比較麻煩,我這裏選擇在系統的環境變量中添加頭文件路徑,一勞永逸。
如下圖所示,在系統環境變量中新建一個INCLUDE變量(必須是大寫),然後指定其路徑,把c++的頭文件路徑包含進去。
添加頭文件技巧
很多時候,我們自己也不清楚到底要添加哪些系統的頭文件。我們打開visual studio,新建一個空項目,然後編譯沒問題,說明visual studio已經默認爲我們添加了需要的頭文件,我們只要把visual studio爲我們添加的默認的頭文件添加到INCLUDE指定的路徑裏就可以了。那麼,vs爲我們默認添加了哪些頭文件呢,打開vs,依次找到VC++目錄,找到包含目錄,如下圖所示:(我的是英文版,我不知道中文版的vs這裏是怎麼翻譯的,將就看着吧,應該能看懂吧),把vs推斷的頭文件目錄都添加到INCLUDE中即可;
找不到庫文件
如下圖所示,我們添加了頭文件,編譯不會提示找不到頭文件的問題了,但是又提示找不到庫。在系統環境變量中添加LIB(必須是大寫),然後把系統的庫文件包含進來即可,到底需要添加哪些庫,還是看vs默認包含的庫目錄,如下圖所示。
重啓電腦,重啓電腦,重啓電腦!
我們把頭文件,靜態庫以及編譯器路徑都添加到環境變量中了,也許vs code還是會提示找不到路徑的問題,彆着急,重啓電腦即可。
使用cmd判斷是否配置成功----這一步不是必須的
重啓完電腦後,我們先不着急使用vs code編譯,先使用cmd調用cl編譯器編譯看看有沒有問題,看看我們的頭文件,靜態庫目錄是否都正確包含了。
如圖所示,打開cmd,輸入cl xxxx.cpp,其中,xxxx是你要編譯的cpp文件的完整路徑,如果正確輸出out: xxx.exe,則表明沒問題了,頭文件和庫目錄都正確包含了。
編譯的一些說明
- 仔細看看我的編譯情況,有一個編譯警告C4530,關於異常處理的警告,提示我們指定**/EHsc編譯參數,還記得我們配置Tasks.json**文件的時候,args 指定了編譯參數,我們在那裏指定了 /EHsc,就是告訴編譯器使用c++的異常。
- LNK2019錯誤。因爲我的main.cpp文件中還引用的Test.cpp文件,而我只指定了編譯main.cpp文件,沒有指定編譯Test.cpp,即我在編譯main.cpp的時候還需要調用Test.cpp文件,而我沒指定這個文件,編譯器就不鏈接這個文件,導致我的main.cpp鏈接失敗。再次回去看看我們前面配置的Tasks.json文件,編譯參數args 包括了我需要鏈接的所有cpp文件,所以編譯不會有問題。
開心的使用vs code開發c++吧
到目前爲止,我們所有的配置都完成了。然後編譯鏈接我們的程序即可。
編譯:ctrl+shift+B
運行:ctrl+F5
實際上我們第一次編譯生成exe可執行文件之後,ctrl+F5
調用cmd
執行沒任何問題。但是如果我們因爲某種原因修改了部分代碼,然後重新編譯生成exe文件,然後再次ctrl+F5
就失效了,無法再次調用cmd
執行可執行文件了。
我們一般可以選中要運行的可執行文件,右鍵選擇在終端打開,然後在終端輸入我們待運行的可執行文件即可。
工程結構
雖然說我們用vs code開發一些簡短的c++程序,但是把所有的cpp,hpp文件都放在同級目錄下,導致整個工程文件看起來很混亂,我一般喜歡按如下圖所示管理我的工程文件,include中放頭文件,src中放源文件,即頭文件與源文件分離,如果還需要包括靜態庫文件,則新建一個lib文件夾,這樣整個工程目錄看起來就清爽多了。
複雜的目錄結構並不會增加我們的配置,tasks.json,c_cpp_properties.json以及launch.json文件的配置不變,只是我們在寫cpp文件包含頭文件的時候,需要指定頭文件的路徑,比如:
這樣,使用vs code管理並執行一個簡短但又稍微複雜一點的工程文件就完成了。
調試輸出中文亂碼
由於我的系統是win10 中文版,系統默認的編碼格式爲GBK
。但是vs code的源碼默認編碼格式爲utf-8
,如下圖所示:
我們編譯可執行文件時,vs code把字符串按照utf-8
的格式存儲,與我們的cmd
默認編碼格式不一樣。我們可以臨時把cmd
窗口的編碼格式改爲utf-8
來解決編碼不一致導致的亂碼問題(實際上我們也可以通過Windows的字體設置選項來設置整個Windows系統的默認編碼爲utf-8
,但這種方式會導致你原有的gbk
編碼的文件全部亂碼,得不償失)。
- 查看
cmd
的編碼格式:chcp
,如下圖所示,返回編碼頁936,這是gb2312
格式
- 輸入
chcp 65001
,設置當前編碼格式爲utf-8
。
- 亂碼解決
結束
現在再看看當初的配置過程,仔細想想其實並不複雜。最大的難度在於我們不知道配置每個json文件的目的,還有可能對編譯過程不瞭解,更談不上設置編譯參數了。