【小白向】MAC端VSCode C++环境配置(超干货、超详细)

提示:使用环境为 MAC(M2)

其实 VSCode 很早就下载好了,但是因为在配置过程中总是遇到很多坑,搁置了很久,回头捡起遇到报 Error 还是两眼抓瞎,到处翻 blog。为了减少以后的遇坑可能性,整理了这份笔记(支持编译多cpp文件支持C++11以上的新特性),希望能够帮助小白同学避坑。

分两个版本,本文是详细版本。

版本区别如下:

  1. 对于有时间的朋友:请查看详细版本。本着“授人以鱼不如授人以渔”的想法,和大多数的博客不同,此版本里除了详细记录了配置步骤,也基于官方文档拓展了配置文件所对应的功能和参数简介,能够让大家举一反三,后续碰到问题时快速做定位
  2. 对于没耐心希望快速解决当前问题的朋友:跳转 TLDR(too long, dont read)版本。只包含教程步骤。

详细版本

前提

  1. 安装 Visual Studio Code
  2. VSCode 中安装 C/C++扩展
    在这里插入图片描述
  3. 确保 Clang 已经安装(在终端中输入命令:clang --version 来确认是否安装)

创建你的第一个 HelloWorld 程序

创建工作区(WorkSpace)

打开 VSCode, 创建一个 project 文件夹。
在这里插入图片描述
现在,project 就是我们的工作区(WorkSpace)了。当我们继续做完本教程的配置,这个工作区中将出现一个子文件夹.vscode,包含三个文件。
tasks.json(编译选项设置)
launch.json(调试选项设置)
c_cpp_properties.json(编译器路径以及IntelliSense 设置)

创建 HelloWorld 的源代码文件

在 project 文件夹下创建一个 hello.cpp 文件
在这里插入图片描述
hello.cpp中粘贴以下内容

#include <iostream>

using namespace std;

int main(){
    cout << "Hello World" << endl;
}

Command+S(⌘S)保存该文件,建议在 File > Auto Save 中打开该选项,自动保存。
在这里插入图片描述

添加 IntelliSense 配置

IntelliSense 是 VS Code 中提供的工具,可实现代码补全等,帮助快速开发。
Shift+Command+P(⇧⌘P)打开命令面板,输入Select IntelliSense Configuration,选择 Use clang++
可以看到工作区中新增了一个.vscode 的文件夹,并包含了一个叫做 settings.json 的文件
在这里插入图片描述

运行 HelloWorld(compile and run)

注意:C++扩展是使用机器上已安装的 C++编译器来生成程序,所以在运行/调试 hello.cpp 前,请确保你已经符合了文章开头的前提,安装好了 C++编译器。

  1. 打开 hello.cpp,这将它将成为 active file,可以被用于生成和调试
  2. 点击图中右上角的按钮,选择 Run C/C++ File
    在这里插入图片描述
  3. 在跳出的选项中,选择C/C++: clang++ build and debug active file
    在这里插入图片描述
    只有在第一次运行 hello.cpp 时才需要做这个选择。选择后,.vscode 文件夹中出现了一个新文件tasks.json,我们选择的编译器配置将作为默认设置。
  4. 编译成功后,程序的输出将显示在下方的 DEBUG CONSOLE
    在这里插入图片描述

至此,我们已经成功地运行了 VS Code 上的第一个 C++程序!

改造代码目录(include、src、target) 以适应工程需要

在实际的开发中,我们往往需要分类不同的文件至不同的文件夹中。一个简单的形式是在其中创建三个子文件夹 include、src、target 分别用来分类头文件、源文件、以及目标程序。
在 project 文件夹中,清理之前生成出来的其他文件(除了 hello.cpp 和.vscode),增加三个子文件夹 includesrctarget,并把 hello.cpp 移动到 src 目录下。
在这里插入图片描述

修改 tasks.json

修改了文件组织形式后,存储了编译配置的 tasks.json 也需要做对应修改。
第一次编译运行 hello.cpp 时,我的机器上生成的 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"
}

我们做如下两个修改:

  1. 工程中往往需要一次性编译选定路径下的所有 cpp 文件。对应的,把"args"中的:"${file}"改为"${fileDirname}/*.cpp"
  2. 我们希望把编译出的文件统一放置在 target 文件夹下。对应的,把"args"中的"${fileDirname}/${fileBasenameNoExtension}"改为"${workspaceFolder}/target/${fileBasenameNoExtension}"
    在这里插入图片描述

然后我们做下测试,看看修改后的工作区可否正常编译运行 hello.cpp
在 include 中创建 print.h,粘贴如下内容:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

void printMessage(vector<string>& msg);

在 src 中创建 print.cpp,粘贴如下内容:

#include "../include/print.h"

void printMessage(vector<string> &msg)
{
    for (int i = 0; i < msg.size(); i ++){
        cout << msg[i] << " ";
    }
}

修改 src 下的 hello.cpp,粘贴如下内容:

#include "../include/print.h"

int main(){
    vector<string> msg;
    msg.push_back("Hello"); msg.push_back("World");
    printMessage(msg);
}

在 hello.cpp 中点击右上角的 run 按钮,可以看到也成功运行了(这说明我们实现了一次性编译多个 cpp 文件),而且目标文件生成到了 target 下。
在这里插入图片描述

拓展:关于 tasks.json 的设置含义

tasks.json 中存储了编译的设置,更深刻地理解它有助于解决后续可能遇到的编译错误。
以上面贴出的 task.json 内容为例,对 tasks.json 中的参数解析如下:

  • label
    *第一次点击 Run C/C++ File 时指定的选项值。在本例中,是"C/C++: clang++ build active file"
  • command
    指定要运行的程序(编译器) 在本例中,是 clang++
  • args
    指定传递给编译器的命令行参数,这些参数应当按照一定的顺序排列

    在最开始生成的 tasks.json 中,args 相关参数设置如下:
    "args": ["-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}"]

    他的含义是告知 C++编译器编译 active file(即${file}),生成目标文件(-o)到当前的目录下
    (${fileDirname}) ,目标文件的名称和不带后缀的 active file 的名称一致(${fileBasenameNoExtension})。
    因此我们第一次运行时,在 hello.cpp 中 run,在 同级目录下编译出了 hello 目标文件。

    至此,应该也能理解将原先的"-g", "${file}"改为"-g", "${fileDirname}/*.cpp"带来的影响了吧,就是将编译当前 active file 变成编译同级目录下的所有 cpp 文件

    而将"-o", "${fileDirname}/${fileBasenameNoExtension}"
    改为"-o", "${workspaceFolder}/target/${fileBasenameNoExtension}"则是改变目标文件的路径到工作区下的 target 目录下。

  • problemMatcher
    在编译器输出中查找错误和警告的输出解析器。对于 clang++,gcc 是最佳的 problemMatcher
  • group
    里面的 isDefault 选项可以用来指定哪个 task 被作为默认的生成选项。生成了 tasks.json 后,点击 run 按钮就会按照默认选定的 task 配置进行编译运行,tasks 中可以有多个 task,不需要作为默认项的移除
    “group"中的"isDefault”: true
  • detail
    task 的描述。tasks 中可以用多个 task,detail 可用于做区分

调试 HelloWorld(debug)

  • 首先,回到 hello.cpp,使得其变为 active file
  • 在如图所示处设置一个断点(在该行的前面点击小圆点)
    在这里插入图片描述
  • 选择 Debug C/C++ File
    在这里插入图片描述
    因为之前我们已经在 hello.cpp 上选择过 Run C/C++ File 编译运行过了,当时选择了C/C++: clang++ build and debug active file,此时就不必再选择了。如果此前没有运行过就选择了 debug,那么在跳出的选项中选择C/C++: clang++ build and debug active file。
    在这里插入图片描述
  • 可以看到程序执行到端点处,执行位置有高亮表示。出现了调试的工具栏,可以分别选择执行到下一个断点、执行单步、步入、跳出、重新开始、停止。这说明可以正常调试了。
    在这里插入图片描述

配置调试设置 launch.json

当我们点击调试按钮(Debug C/C++ File)时,其实内部是为我们创建了一个动态调试配置,但往往我们需要去对调试配置做一些修改,可以创建一个 launch.json 文件来存储我们的调试设置。

  • 点击右上角的 Add Debug Configuration 按钮
    在这里插入图片描述
  • 在跳出的选项里选择C/C++: clang++ build and debug active file.
    在这里插入图片描述
  • .vscode 中会自动创建一个 launch.json 文件
{
    "configurations": [
        {
            "name": "C/C++: clang++ build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/target/${fileBasenameNoExtension}",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "lldb",
            "preLaunchTask": "C/C++: clang++ build active file"
        }
    ],
    "version": "2.0.0"
}

其中,重要的几个参数释义如下:

  • program:需要调试的程序。如果我们是在 hello.cpp 文件中开启调试,则对应调试的程序是project/target/hello
  • args:运行时传递给程序的参数数组
  • stopAtEntry:为 true 时,程序将在main 方法入口处添加断点
  • preLaunchTask:此处的值应当和tasks.json 中的 label 值保持一致

当我们创建了 launch.json,以后在这个程序上的调试都将按照 launch.json 中的调试配置开展。

配置c_cpp_properties.json

可以通过创建c_cpp_properties.json 文件来实现对 C/C++扩展 的更多设置,这里的正确配置可以帮助扩展找到正确的标准库路径,提供补全或跳转能力,如果程序包含不在工作区或标准库路径中的头文件,需修改其中的“includePath”设置。
Shift+Command+P(⇧⌘P) 打开命令面板,输入C/C++: Edit Configurations (UI),打开。这将在.vscode 中创建一个c_cpp_properties.json 文件。
在这里插入图片描述
在界面中做如下修改:
在这里插入图片描述
在这里插入图片描述
也可以在c_cpp_properties.json 中直接修改
在这里插入图片描述
我的c_cpp_properties.json 如下,可以直接复制修改:"cStandard": "c17", "cppStandard": "c++17","compilerPath": "/usr/bin/clang++"这三处。

{
    "configurations": [
        {
            "name": "Mac",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [],
            "macFrameworkPath": [
                "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks"
            ],
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "macos-clang-arm64",
            "compilerPath": "/usr/bin/clang++"
        }
    ],
    "version": 4
}

解决关于 C++新特性支持的问题

在前面的示例中,我有意地在代码里避开了 C++的新特性。
如果我们将代码修改成这样
print.cpp:

#include "../include/print.h"

void printMessage(vector<string> &msg)
{
    for (const auto& word: msg){
        cout << word << " ";
    }
}

hello.cpp:

#include "../include/print.h"

int main(){
    vector<string> msg{"Hello", "World"};
    printMessage(msg);
}

运行会发现,将报告如下的错误,不难看出是 C++11 的新特性没有被支持。
在这里插入图片描述

这种编译报错怎么处理?
还记得我们前面说到的编译选项在哪里设置吗?yes,tasks.json!
在 tasks.json 文件的 args 中添加"–std=c++17"选项,使编译支持 C++新特性

"args": [
                "-fcolor-diagnostics",
                "-fansi-escape-codes",
                "--std=c++17",
                "-g",
                "${fileDirname}/*.cpp",
                "-o",
                "${workspaceFolder}/target/${fileBasenameNoExtension}"
            ],

成功运行。
在这里插入图片描述

成功调试。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/704024.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高能氧化锌电阻片加速老化试验曲线和老化机理%生产测试过程

氧化锌压敏电阻片加速老化的试验方法和得到的试验结果不尽相同。在老化机理的研究中一般可以用加速老化试验时功率损耗随时间的变化来衡量老化性能。分析我们的以及大量国外研究者的试验结果,可以将阀片功率损耗随时间变化的特性大致分为三种不司的类型: 类型1:阀片本身的性能…

SQL 截取函数

目录 1、substring 2、left 3、right 4、substring_index 1、substring 用途&#xff1a;字段截取从指定开始的字符开始&#xff0c;截取要的数&#xff1b;指定开始的字符数字可以用负的&#xff0c;指定开始的字符从后往前(向左)数&#xff0c;截取要的数不能为负。 语…

【吊打面试官系列-Mysql面试题】锁的优化策略有哪些?

大家好&#xff0c;我是锋哥。今天分享关于 【锁的优化策略有哪些?】面试题&#xff0c;希望对大家有帮助&#xff1b; 锁的优化策略有哪些? 1、读写分离 2、分段加锁 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 3、减少锁持有的时间 4.多个线程尽量以相同的…

ultralytics框架讲解

ultralytics简介 Ultralytics是一个开源的计算机视觉和深度学习框架&#xff0c;旨在简化训练、评估和部署视觉模型的过程。该框架提供了一系列流行的视觉模型&#xff0c;包括YOLOv5、YOLOv4、YOLOv3、YOLOv3-tiny、YOLOv5-tiny、EfficientDet、PAN、PP-YOLO等&#xff0c;并提…

[数据集][目标检测]胸部解剖检测数据集VOC+YOLO格式100张10类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;100 标注数量(xml文件个数)&#xff1a;100 标注数量(txt文件个数)&#xff1a;100 标注类别…

【git基本使用】

git 暂未更新&#xff0c;敬请期待&#xff01; vscode 切换其他远程分支 在开发过程中&#xff0c;其他成员在git上新建一个分支在vscode上找不到&#xff0c;如下截图vscode里除了自己的分支就是master的分支。 解决方案&#xff1a; 这时候我们就需要在vscode的终端敲出…

Java | Leetcode Java题解之第148题排序链表

题目&#xff1a; 题解&#xff1a; class Solution {public ListNode sortList(ListNode head) {if (head null) {return head;}int length 0;ListNode node head;while (node ! null) {length;node node.next;}ListNode dummyHead new ListNode(0, head);for (int subL…

【blender特效】卡通火焰

核心思想就是通过多个不同缩放尺寸的沃罗诺伊叠加&#xff0c;分别构成火焰的大型&#xff0c;中型和小型&#xff08;形状&#xff09;&#xff0c;最后通过自发光纹理实现火焰加亮。 用的是ev渲染&#xff0c;完全可以把噪音贴图都烘焙出来&#xff0c;自己改改shader就可以扔…

C脚本实现用键盘按键控制Wincc某按钮动作

文章目录 前言一、创建Wincc画面并添加变量及按钮二、在“事件”-“键盘”下&#xff0c;编写“按下”和“释放”的C脚本 前言 在某些特定场景下&#xff0c;需要通过电脑键盘控制上位机界面上按钮按下或释放&#xff0c;本文给出了基于C脚本的解决方案。 一、创建Wincc画面并…

大文件word生成的处理与解决策略

前言 对于简单word文档的生成导出&#xff0c;java已经有着很多技术来进行处理&#xff0c;在有着相对固定的格式样板下&#xff0c;采用word模板导出相对会是比较好的选择。但是当数据量且包含大量图片后&#xff0c;采用模板导出就显得无力了&#xff0c;模板的缺点是无法应…

深度学习500问——Chapter11:迁移学习(1)

文章目录 11.1 迁移学习基础知识 11.1.1 什么是迁移学习 11.1.2 为什么需要迁移学习 11.1.3 迁移学习的基本问题有哪些 11.1.4 迁移学习有哪些常用概念 11.1.5 迁移学习与传统机器学习有什么区别 11.1.6 迁移学习的核心及度量准则 11.1.7 迁移学习与其他概念的区别 11.1.8 什么…

NLP入门——数据预处理:子词切分及应用

BPE(Byte-Pair Encoding)算法 【西湖大学 张岳老师&#xff5c;自然语言处理在线课程 第十六章 - 4节】BPE&#xff08;Byte-Pair Encoding&#xff09;编码 如果有一个字符串aabaadaab&#xff0c;对其执行BPE算法 因为字符对aa出现频率最高&#xff0c;因此将其替换为码Z&…

Shell环境下的脚本编程与应用

Shell是什么&#xff1f; Shell 是一个命令行解释器&#xff0c;它接收用户输入的命令&#xff08;如 ls、cd、mkdir 等&#xff09;&#xff0c;然后执行这些命令。Shell 同时还是一种功能强大的编程语言&#xff0c;允许用户编写由 shell 命令组成的脚本&#xff08;script&…

vivado HW_SIO_RX

HW_SIO_RX 描述 在硬件设备上&#xff0c;每个GT包括一个独立的接收器hw_sio_rx 由一个PCS和一个PMA组成。高速串行数据从板上的迹线流入 GTX/GTH收发器RX的PMA&#xff0c;进入PCS&#xff0c;最后进入FPGA逻辑。 相关对象 HW_SIO_RX对象与HW_server、HW_target、HW_device、H…

第20篇 Intel FPGA Monitor Program的使用<三>

Q&#xff1a;如何用Intel FPGA Monitor Program创建汇编语言工程呢&#xff1f; A&#xff1a;我们用一个Nios II汇编语言简易应用程序来发掘Intel Monitor FPGA Program软件的一些功能特性&#xff0c;并介绍创建工程的基本步骤。该程序可以实现找到存储在存储器中的32位整…

Electron+Vue开源软件:洛雪音乐助手V2.8畅享海量免费歌曲

洛雪音乐助手是一款功能全面且完全免费的开源音乐软件&#xff0c;支持在Windows、Android和iOS平台上使用。 平台支持&#xff1a; 桌面版&#xff1a;采用Electron Vue技术栈开发&#xff0c;支持Windows 7及以上版本、Mac OS和Linux&#xff0c;具有广泛的用户群体覆盖。 …

opencv roi改进版

点击鼠标左键开始画roi,右键或者回车代表画框完毕 并且做了封装。 import cv2 import numpy as npclass ROIDrawer:def __init__(self, image_path):self.drawing = Falseself.ix, self.iy = -1, -1self.roi = Noneself.image_o = cv2.imread(image_path)self.image = self.…

LeetCode | 21.合并两个有序链表

这道题也是很经典的一道题了&#xff0c;408的算法题中也考过这个思想&#xff0c;因为两个链表已是升序&#xff0c;合并只需要两个指针&#xff0c;分别指向两个表的表头&#xff0c;分别比较两个指针所指向的结点的val&#xff0c;小的就插入到目标链表里面&#xff0c;再后…

火车头采集怎么使用GPT等AI原创文章

火车头采集官方并没有GPT、百度文心一言AI、阿里通义千问AI、Kimi大模型等AI功能&#xff0c;但支持接入插件&#xff0c;可以编写相应人工智能AI原创文章插件&#xff08;火车头采集支持PHP和c#这2种语言的插件编写&#xff09;&#xff0c;或者导入第三方封装好的GPT等AI原创…

使用PHP对接企业微信审批接口的问题与解决办法(二)

在现代企业中&#xff0c;审批流程是非常重要的一环&#xff0c;它涉及到企业内部各种业务流程的规范和高效运转。而随着企业微信的流行&#xff0c;许多企业希望将审批流程整合到企业微信中&#xff0c;以实现更便捷的审批操作。本文将介绍如何使用PHP对接企业微信审批接口&am…