本文基于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、高斯及…