C++(2)--mac使用VScode 进行C++编译、运行、调试

mac 使用VScode 进行C++开发

  • 1.编译的基础概念
  • 2. mac 编译c++代码
    • 2.1 查看编译器情况
    • 2.2 安装插件C/C++,C/C++ Clang Command Adapte
    • 2.3新建一个C++ project
      • 2.3.1本地新建文件夹
      • 2.3.2新建mian.cpp文件
      • 2.3.3 编写hello word demo
    • 2.4 代码编译,运行,调试
      • 2.4.1 命令行编译运行
      • 2.4.2 runcode 插件编译运行
      • 2.4.3 配置文件编译运行调试
        • 2.4.3.1编译调试文件生成
        • 2.4.3.2 文件内容
        • 2.4.3.3 编译运行
        • 2.4.4.4 调试
    • 2.5 Warning: Debuggee TargetArchitecture not detected, assuming x86_64
  • 3.gdb调试
    • gdb 查core

1.编译的基础概念

要运行C++程序,需要 代码编辑器 来编写C++源代码,需要 编译器 来编译源代码生成可执行文件。

C++的编译流程包括:预处理-编译-汇编-链接。

在不同的操作系统下(mac ,windows, Ubuntu),C++的编译流程都是一致的,只是支持流程的编译工具不同。

在mac 环境下,可使用Vscode来编辑C++源代码,使用g++/clang++来编译源代码。

g++ 是 GNU 亲儿子,Ubuntu 等常用发行版标配。
clang++ 是后起之秀,配合 llvm,以优秀的前端闻名于世,现在已经是 Mac(XCode) 的默认编译器。

GCC是一个编译套件,是一个以"gcc"命令为首的源码施工队。施工队的成员有gcc、cpp、as、ld四个成员

  1. 预处理–宏定义展开,头文件引入-- cpp 等价于 gcc -E
  2. 编译–C语言->汇编语言–gcc -S
  3. 汇编–汇编语言->机器语言–gcc -c
  4. 链接–链接相关的.o文件–ld

-o 指定输出文件的名字

(win操纵系统,老九课堂笔记)
1.预处理–将头文件(.h)的具体内容展开至源文件中;删除注释;添加行号和文件标识等;预处理完产生一个.ii文件(c语言编译将产生一个.i文件)

cpp demo.cpp > demo.ii

cpp 为 C Preprocessor的缩写, >表示输出到文件
还有另外两种命令也可以用于产生.ii 文件,其中-o参数用于指定输出文件命

g++ -o demo.ii -E demo.cpp
g++ -o demo.ii demo.cpp

2.编译–对.ii文件进行词法/语法/语义分析,生成相应的汇编文件,.s文件

g++ -o demo.s -S demo.ii

3.汇编–将汇编文件转换成二进制目标文件.o .obj结尾

as -o demo.o demo.s

g++同样可以实现

g++ -o demo.o demo.s

4.连接–将目标文件和C++库函数连接,将涉及到的库代码合并到目标代码中;

g++ -o demo.exe demo.o

生成demo.exe可执行文件

(mac+vscode)
在vscode 终端上输入

g++ main.cpp -o main
"/Users/chenyingying/CppProject/Helloworld/"main

即可运行,(猜测)第一条语句是不是包括了预处理,编译,汇编,连接于一体,生成mac/linux下可执行文件main.out文件。输入目录运行对应的可执行文件。

2. mac 编译c++代码

2.1 查看编译器情况

g++ --version
clang++ --version

输出

(base) chenyingying@chenyingyingdeMacBook-Air ~ % g++ --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 11.0.3 (clang-1103.0.32.62)
Target: x86_64-apple-darwin19.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

(base) chenyingying@chenyingyingdeMacBook-Air ~ % clang++ --version
Apple clang version 11.0.3 (clang-1103.0.32.62)
Target: x86_64-apple-darwin19.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
(base) chenyingying@chenyingyingdeMacBook-Air ~ %

(默认安装?没说没装怎么办呀)

2.2 安装插件C/C++,C/C++ Clang Command Adapte

到VSCode去安装C/C++,C/C++ Clang Command Adapte两款插件,以获得C++语法高亮、错误检查和调试等功能。
在这里插入图片描述

2.3新建一个C++ project

2.3.1本地新建文件夹

2.3.2新建mian.cpp文件

1.在VScode中打开该文件夹
在这里插入图片描述
2.添加一个新的文件
在这里插入图片描述
3.在文件中编辑内容后,右键文件名保存文件为main.cpp文件(文件名可以自定义xxx.cpp)

在这里插入图片描述

在这里插入图片描述

2.3.3 编写hello word demo

#include <iostream>
using namespace std;
int main(){cout << "hello world" << endl;return 0;
}

2.4 代码编译,运行,调试

2.4.1 命令行编译运行

(base) chenyingying@chenyingyingdeMacBook-Air DebugTest % g++ main.cpp -o main
(base) chenyingying@chenyingyingdeMacBook-Air DebugTest % /Users/chenyingying/CppProject/DebugTest/main
hello world1

在这里插入图片描述
(无法断点调试)

2.4.2 runcode 插件编译运行

在这里插入图片描述
1.右键文件名,点击“RunCode”即可编译运行文件,很方便;但无法Debug。
在这里插入图片描述
运行文件后在“OUTPUT”中输出相应的内容
在这里插入图片描述

2.4.3 配置文件编译运行调试

参考博文(对配置文件的介绍比较详细):https://www.jianshu.com/p/7c6599f21052

在使用vscode进行c++调试最重要的是需要launch.json文件(负责调试程序),但是经常也需要tasks.json文件(负责编译程序).

2.4.3.1编译调试文件生成

way1.按钮生成:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时VSCode会在你的工程目录下自动新建一个.vscode的文件夹,并新建了launch.json和task.json的文件.
在这里插入图片描述
在这里插入图片描述
way2:,命令引导
task.json–(shift+command+p -> Tasks:Configure Tasks, -> Create tasks.json form templates -> Others )
launch.json–(shift+command-> Debug->c++(GDB/LLDB))

2.4.3.2 文件内容

参考博文:https://zhuanlan.zhihu.com/p/103308900?from_voters_page=true复制以下的两个文件内容
参考博文:https://www.jianshu.com/p/7c6599f21052 文件参数含义介绍的比较清晰
launch.json

{"version": "0.2.0","configurations": [{"type": "lldb","request": "launch","name": "Debug",//"program": "${workspaceFolder}/test.out",//上一行是官方写法,但是不同的cpp调试都要改配置,非常麻烦"program": "${workspaceFolder}/${fileBasenameNoExtension}","args": [],"cwd": "${workspaceFolder}","preLaunchTask": "Build with Clang"}]
}

task.json

{"version": "2.0.0","tasks": [{"label": "Build with Clang",//这个任务的名字在launch.json最后一项配置"type": "shell","command": "clang++","args": ["-std=c++17","-stdlib=libc++",//"test.cpp",这里是官方写法,不具有普遍性,注意两个配置文件的统一性即可"${fileBasenameNoExtension}.cpp","-o",//"test.out","${fileBasenameNoExtension}","--debug"],"group": {"kind": "build","isDefault": true}}]
}

2.4.3.3 编译运行

按“⇧⌘B”编译,编译成功将生成可执行文件a.out 和main 小黑框
在这里插入图片描述
双击main 小黑框,运行结果展示在界面上。
在这里插入图片描述
在这里插入图片描述

2.4.4.4 调试

在需要调试的文件(避免报文件找不到错误)底下执行调试操作(一下两个图都能开启调试)
在这里插入图片描述
在这里插入图片描述
在teminal中能看到程序输出的信息,左边的watch栏可以查看变量的情况。

2.5 Warning: Debuggee TargetArchitecture not detected, assuming x86_64

完成第3步的设置,正常就可以设置断点调试,设置断点。“Fn+f5”开启调试,但是可能在调试窗口中显示:

Warning: Debuggee TargetArchitecture not detected, assuming x86_64.
在这里插入图片描述

出现这个warming的原因:因为Catalina不再支持lldb调试。
解决:安装插件CodeLLDB(用来debug,解决Catalina不支持lldb调试问题)

3.gdb调试

GNU debugger–Richard Stallman设计的
要想通过gdb调试,必须在编译时加上调试接口,即-g

gcc -g ./rubbish.c input.c readfile.c -o rubbish19_debug
gdb ./rubbish19_debug

GDB 的一些常用指令:

  1. run/r–进入调试状态后,运行代码
  2. break/b–设置断点break 12 # 在源码12行设置断点
  3. list/l–显示源代码
  4. continue/c–继续执行直至下一个端点或者结束
  5. print/p–打印变量的值
  6. examine/x–查看指定内存地址中的数据,(只能查看当前被调试程序能够非法访问的地址)
  7. next/n–单步执行命令。

MAC上使用gdb(完美解决)

(证书没有添加成功,sudo应该可以跑)

gdb 查core

sudo service apport stop    # 关掉某些服务ulimit -c unlimited         # 启动某些东西xxxbuild_run app1_test     # 编译运行某个文件,产生core文件 vcat /proc/sys/kernel/core_pattern   # 查看core文件生成的路径cd xxx/test                # cd core 文件目录gdb app1_test core   	  # gdb 调试出core文件bt                        # 跳转到出core的地方

参考博文:https://zhuanlan.zhihu.com/p/106935263?utm_source=wechat_session
参考博文:
Mac下使用VScode进行C/C++开发:https://www.cnblogs.com/lianshuiwuyi/p/8094388.html
vscode的逻辑是你可以创造很多工作区,每个工作区可以有不同的配置。每个工作区下当然要有项目文件夹,
参考博文:https://zhuanlan.zhihu.com/p/106935263?utm_source=wechat_session

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode136 只出现一次的数字

给定一个非空整数数组&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 说明&#xff1a; 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗&#xff1f; 示例 1: 输入: [2,2,1] 输出: 1 示例 2: …

leetcode94 二叉树的中序遍历

给定一个二叉树&#xff0c;返回它的中序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单&#xff0c;你可以通过迭代算法完成吗&#xff1f; 递归 /*** Definition for a binary tree node.* public class TreeNode …

leetcode647 回文子串

给定一个字符串&#xff0c;你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#xff0c;也会被计为是不同的子串。 示例 1: 输入: "abc" 输出: 3 解释: 三个回文子串: "a", "…

windows下关于Objective-C开发环境的配置

最近IOS一直很火&#xff0c;也想学习以以下OC开发&#xff0c;一般装个虚拟机&#xff0c;然后装个mac&#xff0c;我相信大多数人的机子跑不起来或者很卡&#xff0c;所以之前借鉴了一个文章&#xff0c;就是关于在windows下配置OC开发环境&#xff0c;这里我把自己的安装说一…

PaperNotes(6)-GAN/DCGAN/WGAN/WGAN-GP/WGAN-SN-网络结构/实验效果

GAN模型网络结构实验效果演化1.GAN1.1网络结构1.2实验结果2.DCGAN2.1网络结构2.2实验结果3.WGAN3.1网络结构3.2实验结果4.WGAN-GP4.1网络结构4.2实验结果5.WGAN-SN5.1网络结构5.2实验结果小结1.GAN 文章&#xff1a; https://arxiv.org/pdf/1406.2661.pdf 代码&#xff1a; Py…

Spring Security使用

Spring Security 在web应用开发中&#xff0c;安全无疑是十分重要的&#xff0c;选择Spring Security来保护web应用是一个非常好的选择。 Spring Security 是spring项目之中的一个安全模块&#xff0c;可以非常方便与spring项目无缝集成。特别是在spring boot项目中加入sprin…

leetcode115 不同的子序列

给定一个字符串 S 和一个字符串 T&#xff0c;计算在 S 的子序列中 T 出现的个数。 一个字符串的一个子序列是指&#xff0c;通过删除一些&#xff08;也可以不删除&#xff09;字符且不干扰剩余字符相对位置所组成的新字符串。&#xff08;例如&#xff0c;"ACE" 是…

leetcode104 二叉树的最大深度

给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 示例&#xff1a; 给定二叉树 [3,9,20,null,null,15,7]&#xff0c; 3 / \ 9 20 / \ 15 7 返回它的最大深度…

leetcode105 前序中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如&#xff0c;给出 前序遍历 preorder [3,9,20,15,7] 中序遍历 inorder [9,3,15,20,7] 返回如下的二叉树&#xff1a; 3 / \ 9 20 / \ 15 7 思路&#xff1a; 1、…

leetcode144 二叉树的前序遍历

给定一个二叉树&#xff0c;返回它的 前序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶: 递归算法很简单&#xff0c;你可以通过迭代算法完成吗&#xff1f; 思路&#xff1a;模仿递归的思路压栈即可。 /*** Definition for a bi…

AJAX大总结

1、AJAX概述 1.1 什么是AJAX AJAX&#xff08;Asynchronous Javascript And XML&#xff09;翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互&#xff0c;传输的数据为XML&#xff08;当然&#xff0c;传输的数据不只是XML&#xff09;。 …

关系数据库——mysql数据类型大总结

整数类型&#xff1a; 实数类型&#xff1a; 定点数&#xff1a;DECIMAL和NUMERIC类型在MySQL中视为相同的类型。它们用于保存必须为确切精度的值。 DECIMAL(M,D)&#xff0c;其中M表示十进制数字总的个数&#xff0c;D表示小数点后面数字的位数。 如果存储时&#xff0c;整…

关系数据库——并发控制

并发控制 多用户数据库&#xff1a;允许多个用户同时使用的数据库&#xff08;订票系统&#xff09; 不同的多事务执行方式&#xff1a; 1.串行执行&#xff1a;每个时刻只有一个事务运行&#xff0c;其他事务必须等到这个事务结束后方能运行。 2.交叉并发方式&#xff1a; …

关系数据库——数据库恢复

实现技术 恢复操作的基本原理&#xff1a;冗余 恢复机制涉及的两个关键问题 如何建立冗余数据 数据转储&#xff08;backup&#xff09;登录日志文件&#xff08;logging&#xff09; 如何利用这些冗余数据实施数据库恢复数据转储 数据转储定义&#xff1a; 转储是指DBA将整个数…

算法(22)-leetcode-剑指offer6

leetcode-剑指offer-545.面试题55- 二叉树的深度46.面试题55-2-平衡二叉树47.面试题57-1-和为s的两个数字-双指针48.面试题57-2-和为s 的连续正数序列-双指针49.面试题56-数组中出现数字的次数-位运算leetcode-136 只出现一次的数字Ileetcode-137 只出现一次的数字IIleetcode-2…

leetcode160 相交链表

编写一个程序&#xff0c;找到两个单链表相交的起始节点。 如下面的两个链表&#xff1a; 在节点 c1 开始相交。 示例 1&#xff1a; 输入&#xff1a;intersectVal 8, listA [4,1,8,4,5], listB [5,0,1,8,4,5], skipA 2, skipB 3 输出&#xff1a;Reference of the node…

leetcode101 对称二叉树

给定一个二叉树&#xff0c;检查它是否是镜像对称的。 例如&#xff0c;二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3 说明: 如果你可以运用递归和迭…

Linux内核OOM机制的详细分析

Linux 内核有个机制叫OOM killer&#xff08;Out-Of-Memory killer&#xff09;&#xff0c;该机制会监控那些占用内存过大&#xff0c;尤其是瞬间很快消耗大量内存的进程&#xff0c;为了防止内存耗尽而内核会把该进程杀掉。典型的情况是&#xff1a;某天一台机器突然ssh远程登…

算法(18)-leetcode-剑指offer2

leetcode-剑指offer-211.面试题13-机器人的运动范围-广度优先搜索12.面试题14-1-剪绳子13.面试题14-2-剪绳子214.面试题16-二进制中1的个数-布莱恩克尼根15.面试题16-数值的整数次方-快速幂解析法16.面试题17-打印从1到最大的n位数17.面试题18-删除链表的节点18.面试题19-正则匹…

leetcode21 合并两个链表

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例&#xff1a; 输入&#xff1a;1->2->4, 1->3->4 输出&#xff1a;1->1->2->3->4->4 思路&#xff1a;链表归并。 /*** Definition for si…