在Visual Studio Code中使用Clang
在本教程中,您將在macOS上配置Visual Studio Code以使用Clang/LLVM編譯器和偵錯程式。
配置VS Code後,您將在VS Code中編譯和除錯C++程式。 本教程沒有教你Clang或C++語言。 對於這些主題,網路上有很多很好的資源。
如果您有任何問題,請隨時在VS Code文件儲存庫中為本教程提交問題。
先決條件
要成功完成本教程,您必須完成以下步驟:
- 在macOS上安裝Visual Studio Code。
- 安裝VS Code的C++擴充套件。 您可以透過在擴充套件檢視(⇧⌘X)中搜尋“C++”來安裝C/C++擴充套件。

確保安裝了Clang
您的Mac上可能已經安裝了Clang。 要驗證它是否是,請開啟macOS“終端”視窗,然後輸入以下命令:
clang --version
如果未安裝Clang,請輸入以下命令來安裝命令行開發人員工具,其中包括Clang:
xcode-select --install
建立Hello World應用程式
從macOS終端,建立一個名為 projects的空資料夾,您可以在其中儲存所有VS Code專案,然後建立一個名為 helloworld的子資料夾,導航到該資料夾,並透過在終端視窗中輸入以下命令在該資料夾中開啟VS Code:
mkdir projects
cd projects
mkdir helloworld
cd helloworld
code .
code .命令在當前工作資料夾中開啟VS程式,該資料夾將成為您的“工作區”。 在您瀏覽教程時,在工作區的 .vscode資料夾中建立了三個檔案:
tasks.json(編譯器構建設定)launch.json(偵錯程式設定)c_cpp_properties.json(編譯器路徑和IntelliSense設定)
新增一個hello world源程式檔案
在檔案資源管理器標題欄中,選擇“ 新建檔案 ”按鈕,並將檔案命名為 helloworld.cpp。

貼上以下源程式:
#include
#include
#include
usingnamespacestd;
intmain()
{
vector msg {"Hello", "C++", "World", "from", "VS Code", "and the C++ extension!"};
for (const string& word : msg)
{
cout << word <<" ";
}
cout << endl;
}
現在按⌘S儲存檔案。 請注意,您的檔案列在VS Code側欄的檔案資源管理器檢視(⇧⌘E)中:

您還可以透過選擇 檔案 >自動儲存來啟用自動儲存來自動儲存檔案更改。 您可以在VS Code使用者介面文件中瞭解有關其他檢視的更多資訊。
注意 :當您儲存或開啟C++檔案時,您可能會看到來自C/C++擴充套件的關於Insiders版本可用性的通知,該通知允許您測試新功能和修復。 您可以透過選擇
X( 清除通知 )來忽略此通知。
探索IntelliSense
IntelliSense是一個工具,透過新增程式完成、引數資訊、快速資訊和成員列表等程式編輯功能,幫助您更快、更高效地寫程式。
要檢視IntelliSense的操作,請將滑鼠懸停在 vector或 string上以檢視其型別資訊。 如果您在第10行鍵入 msg.,您可以看到要呼叫的推薦成員函式的完成列表,這些函式都由IntelliSense生成:

您可以按Tab鍵插入所選成員。 然後,當您新增開頭的括號時,會顯示有關函式所需的引數的資訊。
如果IntelliSense尚未配置,請開啟命令調色盤(⇧⌘P)並輸入 選擇IntelliSense配置 。 從編譯器的下拉選單中,選擇 Use clang++進行配置。 更多資訊可以在IntelliSense配置文件中找到。
執行helloworld.cpp
請記住,C++擴充套件使用您安裝在機器上的C++編譯器來構建程式。 在嘗試在VS程式中執行和debughelloworld helloworld.cpp之前,請確保您安裝了C++編譯器,如Clang。
- 開啟
helloworld.cpp,使其成為活動檔案。 - 按下編輯器右上角的播放按鈕。

- 從系統上檢測到的編譯器列表中選擇 C/C++:clang++構建和除錯活動檔案 。

只有在第一次執行 helloworld.cpp時,您才會要求您選擇編譯器。此編譯器是 tasks.json檔案中設定的“預設”編譯器。
- 構建成功後,您的程式輸出將顯示在整合的除錯控制檯中。

恭喜你! 您剛剛在VS程式中執行了第一個C++程式!
理解任務.json
首次執行程式時,C++擴充套件會建立 tasks.json,位於專案的 .vscode資料夾中。tasks.json儲存構建配置。
以下是macOS上 tasks.json檔案的示例:
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: clang++ build active file",
"command": "/usr/bin/clang++",
"args": [
"-fcolor-diagnostics",
"-fansi-escape-codes",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": ["$gcc"],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
],
"version": "2.0.0"
}
注意 :您可以在變數參考中瞭解有關
tasks.json變數的更多資訊。
command設定指定要執行的程式。 在這種情況下,那是 clang++
args陣列指定傳遞給clang++的命令行引數。 這些引數必須按照編譯器預期的順序指定。
This task tells the C++ compiler to take the active file (${file}), compile it, and create an output file (-oswitch) in the current directory (${fileDirname}) with the same name as the active file but without the file extension (${fileBasenameNoExtension}). This process creates helloworld.
label值是您在任務列表中看到的,基於您的個人喜好。
detail值是任務列表中任務的描述。 更新此字串以將其與類似任務區分開來。
problemMatcher值選擇用於在編譯器輸出中查詢錯誤和警告的輸出解析器。 對於clang++,$$gcc問題匹配器會產生最佳結果。
從現在開始,播放按鈕總是從 tasks.json中讀取,以瞭解如何構建和執行程式。 您可以在 tasks.json中定義多個構建任務,任何被標記為預設任務的任務都是播放按鈕使用的任務。 如果您需要更改預設編譯器,您可以在命令調色盤中執行 任務:配置預設構建任務 。 或者,您可以修改 tasks.json檔案,並透過替換此段來刪除預設值:
"group": {
"kind": "build",
"isDefault": true
},
用這個:
"group": "build",
修改任務.json
您可以使用 "${workspaceFolder}/*.cpp"而不是 "${file}"等引數修改 tasks.json以構建多個C++檔案。 這會構建您當前資料夾中的所有 .cpp檔案。 您還可以透過將 "${fileDirname}/${fileBasenameNoExtension}"替換為硬編碼檔名(例如 "${workspaceFolder}/myProgram.out"修改輸出檔名。
除錯helloworld.cpp
要除錯您的程式,
- 回到
helloworld.cpp,以便它是活動檔案。 - 透過單擊編輯器邊距或使用當前行上的F9來設定斷點。

- 從播放按鈕旁邊的下拉選單中,選擇 除錯C/C++檔案 。

- 從系統上檢測到的編譯器列表中選擇 C/C++:clang++構建和除錯活動檔案 (只有在您第一次執行或除錯
helloworld.cpp時才會要求您選擇編譯器)。

- 您將看到任務執行,並將輸出列印到終端視窗。

播放按鈕有兩種模式:執行C/C++檔案和 除錯C/C++檔案 。 預設是上次使用的模式。 如果您在播放按鈕中看到除錯圖示,您可以選擇要除錯的播放按鈕,而不是選擇下拉選單項。
探索偵錯程式
在您開始逐步完成程式之前,讓我們花點時間注意使用者介面的幾個變化:
- 整合終端出現在源程式編輯器的底部。 在“ 除錯控制檯 ”選項卡中,您會看到指示除錯器已啟動並執行的輸出。
- 編輯器突出顯示您在啟動偵錯程式之前設定斷點的行:

- 活動欄中的“ 執行和除錯” 檢視顯示除錯資訊。
- 在程式編輯器的頂部,會出現一個除錯控制面板。 您可以透過抓住左側的點在螢幕上移動它。

逐步瀏覽程式
現在您已經準備好開始逐步完成程式了。
- 在除錯控制面板中選擇Step over圖示,以便突出顯示
for (const string& word : msg)語句。

The **Step Over command skips over all the internal function calls within thevectorandstringclasses that are invoked when themsgvariable is created and initialized. Notice the change in the **Variables window. The contents ofmsgare visible because that statement has completed. - 再次按Step以進入下一個語句(跳過所有執行的內部程式以初始化迴圈)。 現在,變數視窗顯示有關迴圈變數的資訊。
- 再次按Step over以執行
cout語句。 - 如果您願意,您可以繼續按“ 步驟 ” , 直到向量中的所有單詞都列印到控制檯。 但是,如果您感到好奇,請嘗試按“ 步入 ”按鈕來逐步瀏覽C++標準庫中的源程式!
設定一個手錶
您可能想在程式執行時跟蹤變數的值。 您可以透過在變數上設定手錶來做到這一點。
- 將插入點放在環內。 在“ 手錶 ”視窗中,選擇加號並在文字框中鍵入
word。 這是迴圈變數的名稱。 現在,在您逐步透過迴圈時檢視手錶視窗。

- 透過在迴圈前新增此語句來新增另一個手錶:
int i = 0;。 然後,在迴圈中,新增以下語句:++i;。 現在,像在上一步中一樣,為i新增一塊手錶。 - 要在執行暫停時快速檢視任何變數的值,您可以使用滑鼠指標將滑鼠懸停在它上面。

使用launch.json自定義除錯
當您使用播放按鈕或F5進行除錯時,C++擴充套件會實時建立動態除錯配置。
在某些情況下,您希望自定義除錯配置,例如指定引數在執行時傳遞給程式。 您可以在 launch.json檔案中定義自定義除錯配置。
要建立 launch.json,請從播放按鈕下拉選單中選擇“ 新增除錯配置 ”。

然後,您將看到各種預定義的除錯配置的下拉選單。 選擇 C/C++:clang++構建和除錯活動檔案 。
VS Code建立了一個 launch.json檔案,看起來像這樣:
{
"configurations": [
{
"name": "C/C++: clang++ build and debug active file",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "lldb",
"preLaunchTask": "C/C++: clang++ build active file"
}
],
"version": "2.0.0"
}
The program setting specifies the program you want to debug. Here it is set to the active file folder ${fileDirname} and active filename ${fileBasenameNoExtension}, which if helloworld.cpp is the active file will be helloworld. The args property is an array of arguments to pass to the program at runtime.
預設情況下,C++擴充套件不會向源程式新增任何斷點,stopAtEntry值設定為 false。
將 stopAtEntry值更改為 true,以便在您開始除錯時使偵錯程式在 main方法上停止。
確保 preLaunchTask值與 tasks.json檔案中的構建任務的 label相匹配。
從現在開始,在啟動程式進行除錯時,播放按鈕和F5將從您的
launch.json檔案中讀取。
新增額外的C/C++設定
要對C/C++擴充套件進行更多控制,請建立一個 c_cpp_properties.json檔案,該檔案允許您更改設定,如編譯器的路徑,包括要編譯的C++標準(如C++17)的路徑等。
透過執行命令 C/C++ 檢視C/C++配置UI : 從命令調色盤(⇧⌘P)編輯配置(UI)。

這將開啟C/C++配置頁面。

Visual Studio Code將這些設定放置在 .vscode/c_cpp_properties.json中。 如果您直接開啟該檔案,它應該看起來像這樣:
{
"configurations": [
{
"name": "Mac",
"includePath": ["${workspaceFolder}/**"],
"defines": [],
"macFrameworkPath": [
"/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks"
],
"compilerPath": "/usr/bin/clang",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "macos-clang-arm64"
}
],
"version": 4
}
僅當您的程式包含不在工作區或標準庫路徑中的標頭檔案時,您才需要修改包含路徑設定。
編譯器路徑
該擴充套件使用 compilerPath設定來推斷C++標準庫頭檔案的路徑。 當擴充套件知道在哪裡可以找到這些檔案時,它可以提供智慧完成和轉到定義導航等功能。
The C/C++ extension attempts to populate compilerPath with the default compiler location based on what it finds on your system. The compilerPath search order is:
- 已知編譯器名稱的路徑。 編譯器在列表中顯示的順序取決於您的路徑。
- 然後搜尋硬編碼的Xcode路徑,例如
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/
有關更多資訊,請參閱IntelliSense配置文件。
Mac框架路徑
在C/C++配置螢幕上,向下滾動並展開 高階設定 ,並確保Mac框架路徑指向系統頭檔案。 例如:/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks
故障排除
編譯器和連結錯誤
當您開始構建或開始除錯時,helloworld.cpp不是活動檔案時,最常見的錯誤原因(如 undefined _main,或 attempting to link with file built for unknown-unsupported file format等)就會發生。 這是因為編譯器正在嘗試編譯不是源程式的東西,比如你的 launch.json、tasks.json或 c_cpp_properties.json檔案。
如果您看到提及“C++11擴充套件”的構建錯誤,您可能沒有更新您的 tasks.json構建任務以使用clang++引數 --std=c++17。 預設情況下,clang++使用C++98標準,該標準不支援 helloworld.cpp中使用的初始化。請確保將 tasks.json檔案的全部內容替換為“執行helloworld.cpp”部分中提供的程式塊。
終端無法啟動輸入
On macOS Catalina and onwards, you might have the issue where you are unable to enter input, even after setting "externalConsole": true. A terminal window opens, but it does not actually allow you to type any input.
該問題目前正在跟蹤#5079。
解決辦法是讓VS Code啟動一次終端。 您可以透過在 tasks.json中新增和執行此任務來做到這一點:
{
"label": "Open Terminal",
"type": "shell",
"command": "osascript -e 'tell application \"Terminal\"\ndo script \"echo hello\"\nend tell'",
"problemMatcher": []
}
您可以使用“ 終端 ”>“ 執行任務” 執行此特定任務 ...... 然後選擇“ 開啟終端 ”。
一旦您接受許可權請求,除錯時應該會出現外部控制檯。
留言