在macOS上使用VS Code和Clang配置C++開發環境

本文基于VS Code官方文檔,詳細介紹如何在macOS系統下配置Clang/LLVM編譯器與VS Code的C++開發環境。通過本文,你將學會如何搭建開發環境、創建并調試C++程序,適合C++初學者和需要在macOS上進行C++開發的開發者。

前提條件

在開始配置前,請確保你的系統已滿足以下要求:

  1. 安裝Visual Studio Code:從VS Code官網下載并安裝最新版本
  2. 安裝C++擴展:打開VS Code后,在擴展面板(??X)中搜索"C++"并安裝Microsoft官方的C/C++擴展

C/C++ extension

  1. 驗證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)中:

  • 點擊"新建文件"按鈕

New File title bar button

  • 命名為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的文件資源管理器視圖中:

File Explorer

建議啟用自動保存功能(文件 > 自動保存)以避免丟失代碼。

探索IntelliSense功能

IntelliSense是幫助你更快更高效編碼的工具,提供代碼補全、參數信息、快速信息和成員列表等功能。

要查看IntelliSense的實際效果,將鼠標懸停在vectorstring上查看其類型信息。當你在第10行輸入msg.時,可以看到IntelliSense生成的推薦成員函數列表:

Statement completion IntelliSense

你可以按Tab鍵插入選中的成員。添加開括號時,會顯示函數所需參數的信息。

如果IntelliSense尚未配置,打開命令面板(??P)并輸入"Select IntelliSense Configuration",從編譯器下拉列表中選擇Use clang++進行配置。

運行helloworld.cpp

確保helloworld.cpp是活動文件,點擊編輯器右上角的播放按鈕:

Screenshot of helloworld.cpp and play button

從系統檢測到的編譯器列表中選擇"C/C++: clang++ build and debug active file":

C++ debug configuration dropdown

首次運行helloworld.cpp時才會要求選擇編譯器,此編譯器將作為tasks.json文件中的"默認"編譯器。

構建成功后,程序輸出將顯示在集成調試控制臺中:

screenshot of program output

恭喜!你已在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設置斷點:

screenshot of breakpoint in helloworld.cpp

從播放按鈕旁邊的下拉菜單中選擇"Debug C/C++ File":

Screenshot of play button drop-down

從系統檢測到的編譯器列表中選擇"C/C++: clang++ build and debug active file"(首次運行或調試helloworld.cpp時才會要求選擇):

C++ debug configuration dropdown

你將看到任務執行并在終端窗口中打印輸出:

Hello World Terminal Output

播放按鈕有兩種模式:“Run C/C++ File"和"Debug C/C++ File”,默認為上次使用的模式。如果播放按鈕上顯示調試圖標,可直接點擊進行調試。

探索調試器

開始單步執行代碼前,注意用戶界面的幾個變化:

  • 集成終端出現在源代碼編輯器底部,調試控制臺選項卡顯示調試器運行的輸出
  • 編輯器高亮顯示開始調試前設置斷點的行:

Initial breakpoint

  • 活動欄中的"運行和調試"視圖顯示調試信息
  • 代碼編輯器頂部出現調試控制面板,可通過抓住左側的點在屏幕上移動:

Debugging controls

單步執行代碼

現在準備開始單步執行代碼:

選擇調試控制面板中的"單步跳過"圖標,使for (const string& word : msg)語句高亮顯示:

Step over button

"單步跳過"命令會跳過創建和初始化msg變量時vectorstring類中的所有內部函數調用。注意"變量"窗口中的變化,msg的內容現在可見,因為該語句已完成。

再次按"單步跳過"前進到下一條語句(跳過初始化循環執行的所有內部代碼),現在"變量"窗口顯示循環變量的信息。

再次按"單步跳過"執行cout語句。

如果愿意,可以繼續按"單步跳過"直到向量中的所有單詞都打印到控制臺。如果好奇,可以按"單步進入"按鈕單步執行C++標準庫的源代碼!

設置監視

你可能希望跟蹤程序執行時變量的值,可以通過設置變量監視來實現。

在"監視"窗口中,選擇加號并在文本框中輸入word(循環變量的名稱)。單步執行循環時查看"監視"窗口:

Watch window

注意:只有當程序執行在變量的作用域內時,才能看到監視變量的值。例如,循環變量只有在程序執行循環時才可用。

你還可以在程序暫停時將鼠標懸停在任何變量上快速查看其值:

Mouse hover

使用launch.json自定義調試

使用播放按鈕或F5調試時,C++擴展會動態創建調試配置。

在某些情況下,你可能需要自定義調試配置,例如指定運行時傳遞給程序的參數。你可以在launch.json文件中定義自定義調試配置。

要創建launch.json,從播放按鈕下拉菜單中選擇"Add Debug Configuration":

Add debug configuration play button menu

然后會看到各種預定義調試配置的下拉列表,選擇"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是活動文件,則為helloworldargs屬性是運行時傳遞給程序的參數數組。

默認情況下,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:

Command Palette

這將打開C/C++配置頁面:

C++ configuration

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 _mainattempting to link with file built for unknown-unsupported file format等)發生在啟動構建或調試時helloworld.cpp不是活動文件。這是因為編譯器試圖編譯不是源代碼的文件,如launch.jsontasks.jsonc_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文件,調整新工作區路徑、程序名稱等必要設置,開始編碼!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/91219.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91219.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91219.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ganttable 基于工時的進度分析

時間進度分析是 Ganttable 提供的高級進度管理功能&#xff0c;它基于實際工作時長&#xff0c;結合計劃預估工時&#xff0c;可精準計算項目及任務的完成度。開啟進度分析開啟進度分析功能的操作如下&#xff1a;在時間管理頁面&#xff0c;點擊右上角的 “設置” 按鈕&#x…

duiLib 自定義資源目錄

前面的demo&#xff0c;把布局文件放在默認目錄了&#xff0c;想著應該也可以自定義資源路徑。先debug看下默認目錄是什么路徑。設置調試選項&#xff0c;調試信息格式改為程序數據庫&#xff08;/Zi&#xff09;再調試項目&#xff0c;選中監視1&#xff1a;在監護窗口中查看變…

YOLO-01目標檢測基礎

1、概念目標檢測&#xff08;Object Detection&#xff09;是計算機視覺中的一個重要領域&#xff0c;它涉及到識別圖片或視頻某一幀中的物體是什么類別&#xff0c;并確定它們的位置。通常用于多個物體的識別&#xff0c;可以同時處理圖像中的多個實例&#xff0c;并為每個實例…

Linux->動靜態庫

目錄 引入&#xff1a; 一&#xff1a;動靜態庫的介紹 1&#xff1a;庫的本質 2&#xff1a;庫的類別及優缺點 3&#xff1a;動態鏈接 4&#xff1a;靜態鏈接 二&#xff1a;頭文件和庫的查找 三&#xff1a;靜態庫的制作和使用 1&#xff1a;制作 2&#xff1a;指令打…

【LY88】雙系統指南及避坑

一. Windows重裝&#xff08;前提是Windows可正常使用&#xff0c;優點是無需U盤&#xff09; 1. PE工具和系統鏡像 機械師只只提供的資源鏈接 完成微PE工具的安裝并下載了系統鏡像之后&#xff0c;&#xff08;如果要裝ubuntu的話&#xff09;需確認磁盤分區格式和引導項。前…

Ubuntu22.04.1搭建php運行環境

步驟 1: 更新你的系統 首先&#xff0c;確保你的系統是最新的。打開終端并運行以下命令&#xff1a; sudo apt update sudo apt upgrade步驟 2: 安裝Apache Web服務器 使用Apache作為你的Web服務器。運行以下命令&#xff1a; sudo apt install apache2安裝完成后&#xff0c;你…

防止飛書重復回調通知分布式鎖

## 場景銷售訂單下&#xff0c;明細25明細款&#xff0c;發起飛書審批&#xff0c;飛書設置自動審核通過&#xff0c;導致會收到兩次審核通過通知加了分布式鎖 &#xff0c;仍導致執行業務執行兩遍了String lockKey "feihsu-approvalNotify:" instanceCode; RLock …

數據結構:下三角矩陣(Lower Triangular Matrix)

目錄 什么是下三角矩陣&#xff1f; 我們要存哪些元素&#xff1f;一共幾個&#xff1f; 推導索引映射公式 核心問題&#xff1a;給定 (i,j)&#xff0c;如何計算 k&#xff1f; 什么是下三角矩陣&#xff1f; 一個 n n 的矩陣&#xff0c;如果它在主對角線以上的所有元…

力扣209:長度最小的子數組

力扣209:長度最小的子數組題目思路代碼題目 給定一個含有 n 個正整數的數組和一個正整數 target 。 找出該數組中滿足其總和大于等于 target 的長度最小的 子數組 [numsl, numsl1, …, numsr-1, numsr] &#xff0c;并返回其長度。如果不存在符合條件的子數組&#xff0c;返回…

采購管理系統哪家性價比高?

在企業數字化轉型進程中&#xff0c;采購管理系統已成為降本增效的核心工具。但面對市場上五花八門的產品&#xff0c;“性價比” 成為企業選型時的關鍵考量 —— 既要功能貼合業務需求&#xff0c;又要成本可控&#xff0c;還需兼顧實施效率與長期擴展性。以下從性價比維度解析…

輕松打造Unity小游戲AR體驗

目錄 AR會話初始化 平面追蹤與相機定位 用戶交互處理 實時渲染 Unity 小游戲宿主現已支持 AR 功能&#xff0c;本文介紹如何從零開始創建一個可以在Unity小游戲宿主上運行的AR小游戲&#xff0c;歡迎大家試用&#xff01; 想為你的小游戲注入虛實交融的魔力嗎&#xff1f;…

IFCVF驅動+vhost-vfio提高虛擬機網絡性能

??IFCVF (Intel FPGA Virtual Function)?? 是 Intel 為其基于 FPGA 的智能網卡開發的 ??SR-IOV 虛擬功能驅動??,屬于 ??PF4 (Physical Function 4)?? 架構的一部分。它是專為高性能網絡虛擬化場景設計的硬件加速解決方案。 云計算智能網卡(soc)或DPU場景下,IFC…

Hook捕獲并攔截文件創建行為

需要用到minhook 先編譯DLL #include <Windows.h> #include <string> #include <TlHelp32.h> #include <Shlwapi.h>#include "MinHook.h" // 自動選擇正確的MinHook庫 #pragma comment(lib, "Shlwapi.lib") #if defined(_M_X64) …

圖像平滑處理

圖像平滑處理四種常用方式1. 均值濾波 (cv2.blur())2. 高斯濾波 (cv2.GaussianBlur())3. 中值濾波 (cv2.medianBlur())4、雙邊濾波 (cv2.bilateralFilter())總結存圖時遇到一個中文版亂碼問題四種常用方式 平滑處理&#xff08;也稱為模糊處理&#xff09;&#xff0c;用于減少…

fortigate的waf功能

在系統管理----可見功能----web應用防火墻打開waf功能Web 應用程序防火墻 &#xff08;WAF&#xff09; 配置文件可以檢測和阻止已知的 Web 應用程序攻擊。您可以將 WAF 配置文件配置為使用簽名和約束來檢查 Web 流量。您還可以強制實施 HTTP 方法策略&#xff0c;該策略控制與…

AI Compass前沿速覽:可靈創意工坊、字節Coze StudioCoze Loop、通義萬相2.2 、智譜GLM-4.5、騰訊混元3D世界模型開源

AI Compass前沿速覽&#xff1a;可靈創意工坊、字節Coze Studio&Coze Loop、通義萬相2.2 、智譜GLM-4.5、騰訊混元3D世界模型開源 AI-Compass 致力于構建最全面、最實用、最前沿的AI技術學習和實踐生態&#xff0c;通過六大核心模塊的系統化組織&#xff0c;為不同層次的學…

SpringCloud之Gateway

SpringCloud之Gateway 官網地址&#xff1a; https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories 1. 什么是gateway Spring Cloud Gateway 是Spring Cloud官方推出的第二代網關框架&#xff0c;定位于取代 Net…

關于獲取某目錄及子目錄下所有文件且不包含隱藏文件

最近比較忙&#xff0c;很少寫blog了&#xff01;&#xff01;&#xff01;關于獲取目錄及子目錄下所有文件是常遇到的功能&#xff0c;一般通過遞歸遍歷實現。而生產場景中&#xff0c;一般是遍歷nas上的目錄&#xff0c;在nas上利用File.listFiles(),在linux系統上無法獲取含…

docker可視化管理工具lazydocker

Lazydocker 是一個用 Go 語言編寫的命令行 Docker 管理工具。它提供了一個簡潔、直觀的終端界面&#xff0c;支持鍵盤和鼠標操作&#xff0c;可通過方向鍵與快捷鍵實時查看和管理容器、鏡像、網絡等資源&#xff0c;大幅簡化了原本復雜的命令行操作&#xff0c;提升操作效率。2…

少林寺用什么數據庫?

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中國DBA聯盟(ACDU)成員&#xff0c;15年DBA工作經驗 Oracle、PostgreSQL ACE CSDN博客專家及B站知名UP主&#xff0c;全網粉絲15萬 擅長主流Oracle、MySQL、PG、高斯及…