本文說明
當前的使用場景是在windows上遠程編輯linux開發服務器下的代碼,要一個可以代碼補全的編輯器而已,並不使用它來編譯運行windows程序。想用vscode作為IDE的,如果是開發windows程序建議直接下載vs。
本文主要介紹vscode在編寫c/c++程序時候的設置方法,我結合了官方以及網上一些文章里的方法,經過自己的反復測試改進,基本已經用的比較舒服了。
最后強調下,vscode畢竟不是一個IDE,只是一個編輯器,它的代碼補全還是很渣的,經成會掛掉,需要重新索引或者關掉再打開,預期不能太高。
為什么使用vscode
因為vscode基本什么語言都支持,很方便。什么shell、makfile、python、java、cmake、markdown都可以,甚至很偏門的 NVIDA的cuda、tars的.tars都有插件。畢竟雖然是寫c++代碼,但還是經常要寫寫用到其他文件格式,我可以在一個vsc里同時編輯shell、java 、c++、makefile...
為什么不使用vs?visual studio有很多不方便。
沒有工作區的概念
vs2017已經可以以目錄的方式打開一個項目,不需要為Linux代碼也創建.sln文件,但是沒有工作區的概念,一次只能打開一個目錄,而使用vscode我可以把所有相關的目錄都放在一個工作區。
visual studio創建的文件默認編碼是GB2312
這會導致注釋亂碼甚至其他隱晦問題,試過不少方案都沒法設置為默認utf8。畢竟我們是開發linux上的代碼,而linux的默認編碼是utf8。
最重要的是很卡
可能是遠程開發的緣故,文件IO不快,visual stido的后台解析顯得很卡。
vscode的插件和配置介紹
在講具體的配置之前,先介紹下vsc的插件和配置。
vsc的插件很強大,利用插件幾乎可以開發任何語言。點擊左邊的工具欄安裝插件。
vsc的配置分為全局的用戶配置和只在工作區有效的工作區配置,工作區配置是可以覆蓋用戶配置,這個很好理解。依次點擊File->Preferences->Settings打開配置文件。
除了本身的配置,安裝了插件后,有些插件也有配置。
這些配置有些可以直接在圖形界面設置,有些則需要修改json文件。
准備編譯器和標准庫
因為我只是把vscode作為一個編輯器,並不用來編譯,只需要一個庫文件用來智能補全就可以了,所以實際什么編譯器都可以。一共有三種方案:微軟的msvc、clang+mingw、windows10的linux子系統。
msvc的方案
下載一個vs,勾選c++相關的就可以了。
windows的linux子系統,即WSL的方案
裝一個WSL,安裝gcc。這種方法其實也不錯,WSL的安裝體積比VS要小的多,而且你還多了一個“虛擬機”可以用...
clang+mingw64的方案(不建議,下載很慢)
首先下載clang,裝好后會有一個LLVM的目錄,因為clang只是一個編譯器前端,只是做一些詞法解析等工作,它需要LLVM作為編譯器后端。
裝好后下載mingw64,然后下載c++庫。因為clang只是一個編譯器,並沒有庫文件。
下載完畢把將mingw64文件夾里的東西全部復制到LLVM目錄。對於我們來說mingw已經可以刪了。這樣我們就得到一個mingw的c++標准庫文件了。
建議先裝個vs,然后再裝一個WSL,畢竟這兩樣遲早還是用的上的。
安裝c/c++插件
直接搜索C/C++安裝之。
如果是采用clang+mingw的方案,則還需要安裝C/C++ Clang Command Adapter。
c/c++插件的配置介紹
原理:
插件會提供一個配置文件,里面有些編譯器路徑、包含目錄等選項,根據自己的需要配置整個用戶的還是單個工作區的。插件的intelliSense會根據配置里編譯器路徑尋找標准庫,分別是msvc、mingw和WSL里gcc。然后根據設置的包含目錄去找第三方庫和項目里的代碼。
主要選項:
C_Cpp.default.compilerPath
編譯器的路徑,根據你安裝的編譯器配置。如果使用WSL(windows sub linux,具體自己搜索),編譯器路徑可以直接設置/usr/bin/g++,vscode可以自己路徑處理。
C_Cpp.default.intelliSenseMode
有gcc-x64 msvc-x64 clang-x64,這個是和使用的編譯器對應的。
C_Cpp.default.includePath
頭文件包含路徑,是和你代碼里include頭文件相關的,如果配置錯誤就會有波浪線的錯誤提示,反正我們只是編輯查看,沒有強迫證可以不管。如果使用WSL,可以直接寫/usr/local/include。
C_Cpp.default.browse.path
文件的搜索路徑,如果這個路徑配置不對,文件就會找不到,代碼補全就不可用,也無法查看定義。所以這個選項其實是我們這種場景里最重要的選項了。注意這個目錄是可以遞歸的,包含一個目錄之后它下面的所有子目錄也會被包含。同樣,如果使用WSL,你可以直接寫linux的路徑。實際使用中發現,一旦編譯器路徑設置為WSL里的gcc,vsc會自動包含/usr/include下的所有文件。
注意填寫windows路徑的時候要使用/而不是\。
工作區配置示例
如果你有一個項目要長久維護,最好做一個單獨的配置文件。按ctrl+shift+p,選擇c/cpp edit configurations,給工作區添加配置文件。
配置示例:
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceRoot}",
"${workspaceRoot}/src/",
"C:/include"
],
"browse": {
"path": [
"${workspaceRoot}",
"${workspaceRoot}/src/",
"C:/include"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
}
},
{
"name": "Linux",
"compilerPath": "/usr/bin/g++",
"intelliSenseMode": "gcc-x64",
"includePath": [
"${workspaceRoot}/cpp/src",
"${workspaceRoot}/cpp/include",
"${workspaceRoot}/cpp/3rd"
],
"browse": {
"path": [
"${workspaceRoot}/cpp/src",
"${workspaceRoot}/cpp/include",
"${workspaceRoot}/cpp/3rd"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
}
}
],
"version": 4
}
多配置的切換:
我們可以根據自己的需要設置多個配置,上面我配置了兩個配置---Win32和Linux。通過點擊狀態欄右下角的配置按鈕可以進行切換。
全局配置示例
我們也可以弄一個全局的默認配置,這不是必須的,完全可以不配,我是配置了一個使用WSL的簡單方案,在WSL里安裝一些常用的庫,臨時打開一些代碼文件夾后可以很方便地查看。
打開設置,找到插件設置里的c/c++模塊,隨便找一個選項選擇在配置文件中編輯就能打開全局配置界面了。
配置示例:
{
//gcc + WSL
"C_Cpp.default.compilerPath": "/usr/bin/gcc",
"C_Cpp.default.intelliSenseMode": "gcc-x64",
//use clang
// "C_Cpp.autocomplete": "Disabled",//使用clang的話可以使用clang的補全
// "C_Cpp.default.intelliSenseMode": "clang-x64",
//"C_Cpp.default.compilerPath": "C:/Program Files/LLVM/bin/g++.exe",
//use msvc
// "C_Cpp.default.intelliSenseMode": "msvc-x64",
//cpp
"C_Cpp.intelliSenseEngine": "Default",//不設置的話默認使用老引擎
"C_Cpp.default.cStandard": "c11",
"C_Cpp.default.cppStandard": "c++17",
"C_Cpp.default.browse.path": [
"${workspaceFolder}",
],
"C_Cpp.default.includePath":
[
"${workspaceFolder}",
]
}
最佳實踐方案
安裝一個visual studio使用msvc的編譯器
因為使用WSL會導致默認包含WSL里安裝的庫文件,導致要解析的文件太多。你可以通過主界面右下角狀態欄查看當前工程要解析的文件數目。
使用samba映射遠端linux開發服務器的時候一定要選擇“磁盤映射”,而不是“添加一個網絡位置”
經實驗,使用網絡位置要卡的多,可能這樣IO的效率更低。
browse.path不要包含太大的目錄
可以細化到具體幾個需要的子目錄,因為browse.path是遞歸的,包含太大的目錄會導致要解析的文件太多。給自己的代碼目錄設置一個類似src的目錄,因為自己的代碼肯定要包含,如果放在最外面,包進browse.path后就會導致各種其他文件也被包含。
如果工程里有第三方庫的源碼又有第三方庫單獨的include文件,那么只包含前者
因為經常要查看第三方庫里某些方法的實現以及查看例子,我一般會把第三方庫的源碼包含在工程里,但一般情況還會有一個inclue目錄放置所有頭文件,這個時候我在browse.path里只配置源碼。
如果之前好的現在不行了,要相信這不是你的錯...
vsc本來也就只是一個編輯器而已...按ctrl+shift+p,重置intelliSense,實在不行關閉重新打開...
其他一些使用經驗
使用env:XX可以調用系統環境變量
但是因為斜杠的問題,這個用起來不是很舒服。
使用WSL,可以直接寫linux路徑,如/usr/local/include,vsc會自動轉換路徑。
生成文件的目錄
解析代碼后會生成很大的文件,這個文件保存在C:\Users\yourusername\AppData\Roaming\Code。
解析過程
剛打開工程后,vscode會開始解析,出現餅狀圖標的時候表示正在解析,解析完畢這個圖片就沒了。所以如果開始發現代碼不能智能感知,等一下,等vsc解析完畢就好了。
ctrl+shift+p打開命令面板,里面有各種命令
編輯器預設的變量。這個可能在配置腳本的時候用到。
替換終端為bash的方法
"terminal.integrated.shell.windows": "C:\Program Files (x86)\Git\bin\bash.exe"
快捷鍵
ctrl + shift + p 命令欄
ctrl + p 快速打開文件
ctrl + tab 切換文件
ctrl + b 切換左邊工具欄
ctrl + j 切換底部面板