內容目錄

在Visual Studio Code中使用Clang

在本教程中,您將在macOS上配置Visual Studio Code以使用Clang/LLVM編譯器和偵錯程式。

配置VS Code後,您將在VS Code中編譯和除錯C++程式。 本教程沒有教你Clang或C++語言。 對於這些主題,網路上有很多很好的資源。

如果您有任何問題,請隨時在VS Code文件儲存庫中為本教程提交問題。

先決條件

要成功完成本教程,您必須完成以下步驟:

  1. 在macOS上安裝Visual Studio Code
  2. 安裝VS CodeC++擴充套件。 您可以透過在擴充套件檢視(⇧⌘X)中搜尋“C++”來安裝C/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的操作,請將滑鼠懸停在 vectorstring上以檢視其型別資訊。 如果您在第10行鍵入 msg.,您可以看到要呼叫的推薦成員函式的完成列表,這些函式都由IntelliSense生成:

語句完成IntelliSense

您可以按Tab鍵插入所選成員。 然後,當您新增開頭的括號時,會顯示有關函式所需的引數的資訊。

如果IntelliSense尚未配置,請開啟命令調色盤(⇧⌘P)並輸入 選擇IntelliSense配置 。 從編譯器的下拉選單中,選擇 Use clang++進行配置。 更多資訊可以在IntelliSense配置文件中找到。

執行helloworld.cpp

請記住,C++擴充套件使用您安裝在機器上的C++編譯器來構建程式。 在嘗試在VS程式中執行和debughelloworld helloworld.cpp之前,請確保您安裝了C++編譯器,如Clang。

  1. 開啟 helloworld.cpp,使其成為活動檔案。
  2. 按下編輯器右上角的播放按鈕。
    helloworld.cpp的螢幕截圖和播放按鈕
  3. 從系統上檢測到的編譯器列表中選擇 C/C++:clang++構建和除錯活動檔案
    構建和除錯任務

只有在第一次執行 helloworld.cpp時,您才會要求您選擇編譯器。此編譯器是 tasks.json檔案中設定的“預設”編譯器。

  1. 構建成功後,您的程式輸出將顯示在整合的除錯控制檯中。
    程式輸出的螢幕截圖

恭喜你! 您剛剛在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

要除錯您的程式,

  1. 回到 helloworld.cpp,以便它是活動檔案。
  2. 透過單擊編輯器邊距或使用當前行上的F9來設定斷點。
    helloworld.cpp中斷點的螢幕截圖
  3. 從播放按鈕旁邊的下拉選單中,選擇 除錯C/C++檔案
    播放按鈕下拉選單的螢幕截圖
  4. 從系統上檢測到的編譯器列表中選擇 C/C++:clang++構建和除錯活動檔案 (只有在您第一次執行或除錯 helloworld.cpp時才會要求您選擇編譯器)。
    構建和除錯任務
  5. 您將看到任務執行,並將輸出列印到終端視窗。
    你好,世界終端輸出

播放按鈕有兩種模式:執行C/C++檔案除錯C/C++檔案 。 預設是上次使用的模式。 如果您在播放按鈕中看到除錯圖示,您可以選擇要除錯的播放按鈕,而不是選擇下拉選單項。

探索偵錯程式

在您開始逐步完成程式之前,讓我們花點時間注意使用者介面的幾個變化:

  • 整合終端出現在源程式編輯器的底部。 在“ 除錯控制檯 ”選項卡中,您會看到指示除錯器已啟動並執行的輸出。
  • 編輯器突出顯示您在啟動偵錯程式之前設定斷點的行:
    初始斷點
  • 活動欄中的“ 執行和除錯” 檢視顯示除錯資訊。
  • 在程式編輯器的頂部,會出現一個除錯控制面板。 您可以透過抓住左側的點在螢幕上移動它。
    除錯控制

逐步瀏覽程式

現在您已經準備好開始逐步完成程式了。

  1. 在除錯控制面板中選擇Step over圖示,以便突出顯示 for (const string& word : msg)語句。
    跨過按鈕
    The **Step Over command skips over all the internal function calls within the vector and stringclasses that are invoked when the msg variable is created and initialized. Notice the change in the **Variables window. The contents of msg are visible because that statement has completed.
  2. 再次按Step以進入下一個語句(跳過所有執行的內部程式以初始化迴圈)。 現在,變數視窗顯示有關迴圈變數的資訊。
  3. 再次按Step over以執行 cout語句。
  4. 如果您願意,您可以繼續按“ 步驟 直到向量中的所有單詞都列印到控制檯。 但是,如果您感到好奇,請嘗試按“ 步入 ”按鈕來逐步瀏覽C++標準庫中的源程式!

設定一個手錶

您可能想在程式執行時跟蹤變數的值。 您可以透過在變數上設定手錶來做到這一點。

  1. 將插入點放在環內。 在“ 手錶 ”視窗中,選擇加號並在文字框中鍵入 word。 這是迴圈變數的名稱。 現在,在您逐步透過迴圈時檢視手錶視窗。
    觀察視窗
  2. 透過在迴圈前新增此語句來新增另一個手錶:int i = 0;。 然後,在迴圈中,新增以下語句:++i;。 現在,像在上一步中一樣,為 i新增一塊手錶。
  3. 要在執行暫停時快速檢視任何變數的值,您可以使用滑鼠指標將滑鼠懸停在它上面。
    滑鼠懸停

使用launch.json自定義除錯

當您使用播放按鈕或F5進行除錯時,C++擴充套件會實時建立動態除錯配置。

在某些情況下,您希望自定義除錯配置,例如指定引數在執行時傳遞給程式。 您可以在 launch.json檔案中定義自定義除錯配置。

要建立 launch.json,請從播放按鈕下拉選單中選擇“ 新增除錯配置 ”。

新增除錯配置播放按鈕選單

然後,您將看到各種預定義的除錯配置的下拉選單。 選擇 C/C++:clang++構建和除錯活動檔案C++除錯配置下拉列表

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++配置頁面。

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.jsontasks.jsonc_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": []
}

您可以使用“ 終端 ”>“ 執行任務” 執行此特定任務 ...... 然後選擇“ 開啟終端 ”。

一旦您接受許可權請求,除錯時應該會出現外部控制檯。

下一步

最後修改日期: 2024 年 8 月 5 日

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。