本文基于VS Code官方文檔,詳細介紹如何在macOS系統下配置Clang/LLVM編譯器與VS Code的C++開發環境。通過本文,你將學會如何搭建開發環境、創建并調試C++程序,適合C++初學者和需要在macOS上進行C++開發的開發者。
前提條件
在開始配置前,請確保你的系統已滿足以下要求:
- 安裝Visual Studio Code:從VS Code官網下載并安裝最新版本
- 安裝C++擴展:打開VS Code后,在擴展面板(??X)中搜索"C++"并安裝Microsoft官方的C/C++擴展
- 驗證Clang安裝:macOS通常預裝了Clang編譯器,可通過終端驗證:
clang --version
如果未安裝Clang,終端會提示安裝命令行開發者工具,或直接運行:
xcode-select --install
創建Hello World項目
1. 初始化項目文件夾
打開終端,執行以下命令創建項目目錄并在VS Code中打開:
mkdir projects
cd projects
mkdir helloworld
cd helloworld
code .
code .
命令會在當前目錄啟動VS Code,該目錄將作為你的工作區。
2. 創建源代碼文件
在VS Code的文件資源管理器(??E)中:
- 點擊"新建文件"按鈕
- 命名為
helloworld.cpp
- 粘貼以下代碼:
#include <iostream>
#include <vector>
#include <string>using namespace std;int main()
{vector<string> msg {"Hello", "C++", "World", "from", "VS Code", "and the C++ extension!"};for (const string& word : msg){cout << word << " ";}cout << endl;
}
按?S保存文件。注意你的文件會顯示在VS Code的文件資源管理器視圖中:
建議啟用自動保存功能(文件 > 自動保存)以避免丟失代碼。
探索IntelliSense功能
IntelliSense是幫助你更快更高效編碼的工具,提供代碼補全、參數信息、快速信息和成員列表等功能。
要查看IntelliSense的實際效果,將鼠標懸停在vector
或string
上查看其類型信息。當你在第10行輸入msg.
時,可以看到IntelliSense生成的推薦成員函數列表:
你可以按Tab鍵插入選中的成員。添加開括號時,會顯示函數所需參數的信息。
如果IntelliSense尚未配置,打開命令面板(??P)并輸入"Select IntelliSense Configuration",從編譯器下拉列表中選擇Use clang++
進行配置。
運行helloworld.cpp
確保helloworld.cpp
是活動文件,點擊編輯器右上角的播放按鈕:
從系統檢測到的編譯器列表中選擇"C/C++: clang++ build and debug active file":
首次運行helloworld.cpp
時才會要求選擇編譯器,此編譯器將作為tasks.json
文件中的"默認"編譯器。
構建成功后,程序輸出將顯示在集成調試控制臺中:
恭喜!你已在VS Code中成功運行第一個C++程序!
理解tasks.json
首次運行程序時,C++擴展會在項目的.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"
}
關鍵設置說明:
command
: 指定要運行的程序(此處為clang++
)args
: 傳遞給clang++的命令行參數,按編譯器期望的順序指定label
: 任務列表中顯示的名稱,可根據個人偏好設置detail
: 任務列表中任務的描述,可更新以區分相似任務problemMatcher
: 用于在編譯器輸出中查找錯誤和警告的輸出解析器
從現在開始,播放按鈕將始終從tasks.json
讀取構建和運行程序的方式。你可以在tasks.json
中定義多個構建任務,標記為默認的任務將被播放按鈕使用。
調試helloworld.cpp
設置斷點并開始調試
返回helloworld.cpp
使其成為活動文件,通過點擊編輯器邊距或在當前行使用F9設置斷點:
從播放按鈕旁邊的下拉菜單中選擇"Debug C/C++ File":
從系統檢測到的編譯器列表中選擇"C/C++: clang++ build and debug active file"(首次運行或調試helloworld.cpp
時才會要求選擇):
你將看到任務執行并在終端窗口中打印輸出:
播放按鈕有兩種模式:“Run C/C++ File"和"Debug C/C++ File”,默認為上次使用的模式。如果播放按鈕上顯示調試圖標,可直接點擊進行調試。
探索調試器
開始單步執行代碼前,注意用戶界面的幾個變化:
- 集成終端出現在源代碼編輯器底部,調試控制臺選項卡顯示調試器運行的輸出
- 編輯器高亮顯示開始調試前設置斷點的行:
- 活動欄中的"運行和調試"視圖顯示調試信息
- 代碼編輯器頂部出現調試控制面板,可通過抓住左側的點在屏幕上移動:
單步執行代碼
現在準備開始單步執行代碼:
選擇調試控制面板中的"單步跳過"圖標,使for (const string& word : msg)
語句高亮顯示:
"單步跳過"命令會跳過創建和初始化msg
變量時vector
和string
類中的所有內部函數調用。注意"變量"窗口中的變化,msg
的內容現在可見,因為該語句已完成。
再次按"單步跳過"前進到下一條語句(跳過初始化循環執行的所有內部代碼),現在"變量"窗口顯示循環變量的信息。
再次按"單步跳過"執行cout
語句。
如果愿意,可以繼續按"單步跳過"直到向量中的所有單詞都打印到控制臺。如果好奇,可以按"單步進入"按鈕單步執行C++標準庫的源代碼!
設置監視
你可能希望跟蹤程序執行時變量的值,可以通過設置變量監視來實現。
在"監視"窗口中,選擇加號并在文本框中輸入word
(循環變量的名稱)。單步執行循環時查看"監視"窗口:
注意:只有當程序執行在變量的作用域內時,才能看到監視變量的值。例如,循環變量只有在程序執行循環時才可用。
你還可以在程序暫停時將鼠標懸停在任何變量上快速查看其值:
使用launch.json自定義調試
使用播放按鈕或F5調試時,C++擴展會動態創建調試配置。
在某些情況下,你可能需要自定義調試配置,例如指定運行時傳遞給程序的參數。你可以在launch.json
文件中定義自定義調試配置。
要創建launch.json
,從播放按鈕下拉菜單中選擇"Add Debug Configuration":
然后會看到各種預定義調試配置的下拉列表,選擇"C/C++: clang++ build and debug active file"。
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"
}
program
設置指定要調試的程序,此處設置為活動文件文件夾(${fileDirname}
)和活動文件名(${fileBasenameNoExtension}
),如果helloworld.cpp
是活動文件,則為helloworld
。args
屬性是運行時傳遞給程序的參數數組。
默認情況下,C++擴展不會在源代碼中添加任何斷點,stopAtEntry
值設置為false
。將stopAtEntry
值更改為true
可使調試器在啟動調試時在main
方法處停止。
確保preLaunchTask
值與tasks.json
文件中構建任務的label
匹配。
從現在開始,播放按鈕和F5將在啟動程序進行調試時讀取launch.json
文件。
添加其他C/C++設置
要更全面地控制C/C++擴展,可以創建c_cpp_properties.json
文件,允許你更改編譯器路徑、包含路徑、編譯所用的C++標準(如C++17)等設置。
從命令面板(??P)運行命令"C/C++: Edit Configurations (UI)",打開C/C++配置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
}
只有當程序包含不在工作區或標準庫路徑中的頭文件時,才需要修改"Include path"設置。
常見問題及解決方法
編譯器和鏈接錯誤
最常見的錯誤(如undefined _main
或attempting to link with file built for unknown-unsupported file format
等)發生在啟動構建或調試時helloworld.cpp
不是活動文件。這是因為編譯器試圖編譯不是源代碼的文件,如launch.json
、tasks.json
或c_cpp_properties.json
文件。
如果看到提及"C++11 extensions"的構建錯誤,可能是因為你沒有更新tasks.json
構建任務以使用--std=c++17
的clang++參數。默認情況下,clang++使用C++98標準,不支持helloworld.cpp
中使用的初始化方式。確保用"運行helloworld.cpp"部分提供的代碼塊替換tasks.json
文件的全部內容。
終端無法啟動輸入
在macOS Catalina及更高版本上,即使設置了"externalConsole": true
,也可能無法輸入內容。終端窗口會打開,但實際上不允許輸入任何內容。
此問題目前在#5079中跟蹤。
解決方法是讓VS Code啟動終端一次。你可以通過在tasks.json
中添加并運行以下任務來實現:
{"label": "Open Terminal","type": "shell","command": "osascript -e 'tell application \"Terminal\" to do script \"echo hello\"'","problemMatcher": []
}
通過"終端 > 運行任務…"并選擇"Open Terminal"來運行此特定任務。
接受權限請求后,調試時應顯示外部控制臺。
后續步驟
- 探索VS Code用戶指南
- 查看C++擴展概述
- 創建新工作區,復制.json文件,調整新工作區路徑、程序名稱等必要設置,開始編碼!