Code和Clang配置C++开发环境

简介: 本文介绍了如何在VS Code中配置C++开发环境,包括安装VS Code、C++扩展、Clang编译器,创建并运行Hello World项目,使用IntelliSense、调试程序及自定义配置等内容,帮助开发者快速上手C++开发。

在开始配置前,请确保你的系统已满足以下要求:

  1. 安装Visual Studio Code:从VS Code官网下载并安装最新版本
  2. 安装C++扩展:打开VS Code后,在扩展面板(⇧⌘X)中搜索"C++"并安装Microsoft官方的C/C++扩展

C/C++ extension

  1. 验证Clang安装:macOS通常预装了Clang编译器,可通过终端验证:

代码语言:bash

AI代码解释

clang --version

如果未安装Clang,终端会提示安装命令行开发者工具,或直接运行:

代码语言:bash

AI代码解释

xcode-select --install

创建Hello World项目

1. 初始化项目文件夹

打开终端,执行以下命令创建项目目录并在VS Code中打开:

代码语言:bash

AI代码解释

mkdir projects
cd projects
mkdir helloworld
cd helloworld
code .

code .命令会在当前目录启动VS Code,该目录将作为你的工作区。

2. 创建源代码文件

在VS Code的文件资源管理器(⇧⌘E)中:

  • 点击"新建文件"按钮

New File title bar button

  • 命名为helloworld.cpp
  • 粘贴以下代码:

代码语言:cpp

代码运行次数:0

运行

AI代码解释

#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示例:

代码语言:json

AI代码解释

{
  "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":

aly.h4cshop.com55

从系统检测到的编译器列表中选择"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",默认为上次使用的模式。如果播放按钮上显示调试图标,可直接点击进行调试。

探索调试器

开始单步执行代码前,注意用户界面的几个变化:

  • 集成终端出现在源代码编辑器底部,调试控制台选项卡显示调试器运行的输出
  • 编辑器高亮显示开始调试前设置断点的行:

  • 活动栏中的"运行和调试"视图显示调试信息
  • 代码编辑器顶部出现调试控制面板,可通过抓住左侧的点在屏幕上移动:

aly.e5wa.com88

单步执行代码

现在准备开始单步执行代码:

选择调试控制面板中的"单步跳过"图标,使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":

aly.extwinks.com77

Add debug configuration play button menu

然后会看到各种预定义调试配置的下拉列表,选择"C/C++: clang++ build and debug active file"。

VS Code会创建launch.json文件,内容如下:

代码语言:json

AI代码解释

{
  "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中,直接打开该文件,内容如下:

代码语言:json

AI代码解释

{
  "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中添加并运行以下任务来实现:

代码语言:json

AI代码解释

{
  "label": "Open Terminal",
  "type": "shell",
  "command": "osascript -e 'tell application \"Terminal\" to do script \"echo hello\"'",
  "problemMatcher": []
}

通过"终端 > 运行任务..."并选择"Open Terminal"来运行此特定任务。

接受权限请求后,调试时应显示外部控制台。

后续步骤

  • 探索VS Code用户指南
  • 查看C++扩展概述
  • 创建新工作区,复制.json文件,调整新工作区路径、程序名称等必要设置,开始编码!
相关文章
|
1月前
|
人工智能 Shell PHP
Cursor使用指南
Cursor是一款AI编程助手,能够帮助开发者自动生成代码、优化项目结构,并提供智能建议。它支持多模型,如Claude、GPT等,可提升编程效率。通过个性化设置与技巧,如精确需求描述、代码注释、版本控制等,开发者能够更高效地完成项目。
|
1月前
|
存储 人工智能 Shell
Lua与C语言接口编程实战指南:打造高性能、灵活的程序
本文深入介绍了 Lua 与 C 语言的交互机制,重点分析了 Lua 作为胶水语言在嵌入式系统、游戏开发(如 Skynet、OpenResty)中的应用。内容涵盖 Lua 环境搭建、虚拟栈管理、C 与 Lua 的相互调用、闭包、Userdata 和注册表的使用等核心技术,并结合代码示例讲解了如何在实际项目中实现 Lua 与 C 的高效交互,适合希望掌握 Lua 扩展与嵌入开发的工程师参考学习。
115 0
|
1月前
|
JSON 人工智能 前端开发
JSON基础知识与实践
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,基于JavaScript语言的子集,具有易读、易解析和跨语言等优点。它广泛应用于前后端数据交换、API设计、配置文件存储及移动应用开发等场景。JSON数据由键值对构成,支持字符串、数值、布尔值、数组和对象等类型,结构清晰且可嵌套,适合网络传输。自2001年由Douglas Crockford提出后,JSON因其简洁性和灵活性逐渐成为互联网主流数据格式之一,并被标准化为ECMA-404。
261 0
|
1月前
|
数据采集 边缘计算 缓存
|
1月前
|
人工智能 自然语言处理 JavaScript
从基础到高阶,全面提升AI生成质量
本文介绍了RAG(Retrieval-Augmented Generation)系统的三大核心模块:文档分块、检索排序与反馈自适应。涵盖17种关键技术,如基础分块、语义分块、上下文增强、重排序、反馈闭环与知识图谱融合等,旨在提升信息检索质量与生成答案的准确性。通过模块化设计,系统可灵活适配不同业务场景,实现持续优化与智能进化,为构建高效、精准的AI应用提供技术支撑。
82 0
|
1月前
|
人工智能 运维 安全
MyEMS:以开源创新构建企业能源管理的自主可控生态
以代码透明和生态共建为核心,助力企业实现能源管理的自主可控与持续创新。其功能覆盖多能源协同、全流程优化及行业定制,显著降低能耗与成本,提升安全与合规水平。通过开源模式,企业可深度定制系统,构建高效低碳的能源管理新范式。
49 0
|
1月前
|
存储 人工智能 安全
合约交互的风险与防护
本文介绍了 Solidity 中外部合约调用的三种方式:通过接口类型调用、使用低级 `.call` 方法以及 `delegatecall` 与 `staticcall`。重点分析了不同调用方式的安全性、适用场景及潜在风险,如重入攻击、Gas 限制和返回值伪造等。同时,总结了防范风险的最佳实践,如使用 Checks-Effects-Interactions 模式、引入 `ReentrancyGuard` 以及限制外部调用来源。最后通过实战演练演示了调用实现和重入攻击的防御效果。
45 0
|
1月前
|
Ubuntu Linux 开发者
在家闲的无聊?教你们做个Linux系统
你可以不用下载也能体验一把ubuntu系统,然后在决定用不用,很照顾各种新人朋友,而且支持中文,有兴趣的用户可以搜索尝试了解一下。
|
编译器 C语言 C++
CMake基础(9)使用Clang编译
CMake基础(9)使用Clang编译
1175 0
|
编译器 C语言 C++
VSCode上搭建C/C++开发环境(vscode配置c/c++环境)Windows系统---保姆级教程
VSCode上搭建C/C++开发环境(vscode配置c/c++环境)Windows系统---保姆级教程
9454 0