IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> VSCode编译单文件及多文件方法(基于g++,cmake,json三种方法) -> 正文阅读

[开发工具]VSCode编译单文件及多文件方法(基于g++,cmake,json三种方法)


一 、单文件编译

在这里插入图片描述

#include <iostream>
using namespace std;
void swap(int &a ,int &b){
    int temp;
    temp = a;
    a = b;
    b = temp;
}
int main(int argc , char **argv){
    int val1 = 10;
    int val2 = 20;

    cout << "before" << endl;
    cout << val1 << endl;
    cout << val2 << endl;
    swap(val1, val2);
    cout << "after" << endl;
    cout << val1 << endl;
    cout << val2 << endl;    
    return 0;
}

首先在终端中输入g++ .\main.cpp ,会发现文件目录里自动生成了一个a.exe文件。然后输入**.\a.exe**,发现程序成功运行了。(用这个方法生成的a.exe是不包含调试信息的,也就是不能对程序进行调试)
在这里插入图片描述
在这里插入图片描述
下面用g++生成带调试信息的程序。在终端中输入:

g++ -g .\main.cpp -o myswap

其中-g表示生成带可调试信息 -o代表输出指定文件名。
可以看到左侧生成了myswap.exe。
在这里插入图片描述
发现这种方法生成的文件和不带调试信息的文件终端输出结果是一样的。
在这里插入图片描述
点击侧边栏运行与调试创建launch.json,选择C++(GDB/LLDB)然后选择g++.exe
在这里插入图片描述
打断点后按F5调试,可以看到已经可以调试了。同时VSCode自动生成了main.exe文件。在这里插入图片描述
.vscode文件夹下面有launch.json和tasks.json都是自动配置的。其中launch.json种的两行比较重要:

  1. “program”: 是要调试的可执行文件
  2. “preLaunchTask”: 调试之前要做的工作,内容和tasks.json中的"label"一致。说明,执行launch.json前会执行tasks.json命令
{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "g++.exe - 生成和调试活动文件",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "D:\\mingw\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: g++.exe 生成活动文件"//其实是这一步生成的main.exe
        }
    ]
}
{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++.exe 生成活动文件",
            "command": "D:\\mingw\\bin\\g++.exe",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "调试器生成的任务。"
        }
    ],
    "version": "2.0.0"
}

二、多文件编译

在这里插入图片描述
其中三个代码文件分别为:

#include <iostream>
using namespace std;
#include "swap.h"
int main(int argc , char **argv){
    int val1 = 10;
    int val2 = 20;
    cout << "before" << endl;
    cout << val1 << endl;
    cout << val2 << endl;
    swap(val1, val2);
    cout << "after" << endl;
    cout << val1 << endl;
    cout << val2 << endl;    
    return 0;
}
void swap(int &a, int &b);
#include "swap.h"

void swap(int &a ,int &b){
    int temp;
    temp = a;
    a = b;
    b = temp;
}

二、使用步骤

1.基于g++

在终端terminal,输入g++ -g .\main.cpp .\swap.cpp -o myswap 就是将所有要编译的cpp文件都写上

PS D:\code\Mo> g++ -g .\main.cpp .\swap.cpp -o myswap

运行启动调试会发现报错。原因是自动生成了json文件不能同时编译多个文件,需要我们手动改,这时打开launch.json,
以下是没修改前的launch.json,我添加的注释是要修改的地方。

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "g++.exe - 生成和调试活动文件",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",//将这一句改成"${fileDirname}/myswap.exe"
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "D:\\mingw\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: g++.exe 生成活动文件"//由于我们通过终端g++命令已经生成了exe文件,所以这行可以注释掉
        }
    ]
}

修改完launch.json文件,保存后,再按调试(F5),发现此时已经可以调试了:

在这里插入图片描述

2.基于cmake

先创建CMkeLists.txt文件。方法同新建cpp文件。
在这里插入图片描述
在这里插入图片描述

project(MYSWAP)//起一个项目名

add_executable(my_cmake_swap main.cpp swap.cpp)//一个是生成的可执行文件名字,其他参数是要加入编译的的cpp文件

Ctrl Shift + p 输入cmake 选择cmake configure ,选择一个编译器(可以是类似GCC8.1.0)我选的是GCC11.2.0。
在这里插入图片描述
在这里插入图片描述
下面输出了信息证明cmake构建完成,同时目录里自动生成了一个build文件夹在这里插入图片描述
终端中输入cd .\build**然后输入mingw32-make.exe**可以看到编译链接后产生了my_cmake_swap文件:
在这里插入图片描述
在这里插入图片描述
为了使文件能够调试,这时候打开launch.json文件,改路径到刚刚生成的build文件夹下的my_cmake_swap文件。
将"program": “ f i l e D i r n a m e / m y s w a p . e x e " , 改 成 " p r o g r a m " : " {fileDirname}/myswap.exe",改成 "program": " fileDirname/myswap.exe","program":"{fileDirname}/build/my_cmake_swap.exe”,

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "g++.exe - 生成和调试活动文件",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/build/my_cmake_swap.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "D:\\mingw\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            //"preLaunchTask": "C/C++: g++.exe 生成活动文件"
        }
    ]
}

此时在main文件下按F5可以正常调试了。
注意点:通过cmake的方式生成的可执行文件,进行调试时只能是之前编译的代码,如果我们想把代码进行更改,需要修改代码后重新cmake出一个新的可执行程序。如下图虽然我改了main函数中的cout两句,F5调试时依然是输出的上一个没修改前的情况。
在这里插入图片描述
重新cmake后,再调试会发现输出了正确的结果。
在这里插入图片描述
在这里插入图片描述
以上步骤由于 //“preLaunchTask”: "C/C++: g++.exe 生成活动文件"这一行注释掉了,也就是没有用task,所以步骤删掉task.json也是可以的。如果取消注释,F5调试会报错。这时候需要新建一个task.json。
在这里插入图片描述
可以把 “preLaunchTask”: “C/C++: g++.exe 生成活动文件” 随便改成别的内容,比如我改成了 “preLaunchTask”: “C/C++生成文件”
然后F5报错,选择配置任务,然后选g++。系统会自动生成一个tasks文件。
在这里插入图片描述

{
	"version": "2.0.0",
	"tasks": [
		{
			"type": "cppbuild",
			"label": "C/C++: g++.exe 生成活动文件",
			"command": "D:\\mingw\\bin\\g++.exe",
			"args": [
				"-fdiagnostics-color=always",
				"-g",
				"${file}",
				"-o",
				"${fileDirname}\\${fileBasenameNoExtension}.exe"
			],
			"options": {
				"cwd": "${fileDirname}"
			},
			"problemMatcher": [
				"$gcc"
			],
			"group": "build",
			"detail": "编译器: D:\\mingw\\bin\\g++.exe"
		}
	]
}

3.不用cmake仅仅是修改json文件

系统自动生成的task文件默认是单文件调试,所以可以修改task.json的args部分,修改后

{
	"version": "2.0.0",
	"tasks": [
		{
			"type": "cppbuild",
			"label": "C/C++: g++.exe 生成活动文件",
			"command": "D:\\mingw\\bin\\g++.exe",
			"args": [
				"-fdiagnostics-color=always",
				"-g",
				"main.cpp",//改了这里
				"swap.cpp",//改了这里
				"-o",
				"${fileDirname}\\out.exe"//改了这里,改成想输出的文件的名字
			],
			"options": {
				"cwd": "${fileDirname}"
			},
			"problemMatcher": [
				"$gcc"
			],
			"group": "build",
			"detail": "编译器: D:\\mingw\\bin\\g++.exe"
		}
	]
}

注意lable和prelaunchtask后内容要对应。 同时launch文件的 “program”: “${fileDirname}/out.exe”,也要和tasks生成的路径相同。
在这里插入图片描述
此时就可以边改代码随时调试了。

4.这个方法我还没实现(有bug)

如果我们既想要用cmake又不想繁琐地在终端中重新cmake,可以将cmake指令写入到task文件中,这样每次F5调试时,都会自动调用cmake指令了。

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
   // launch.json
    "version": "0.2.0",
    "configurations": [
        {
            "name": "g++.exe - 生成和调试活动文件",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/my_cmake_swap.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "D:\\mingw\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "Build"
        }
    ]
}
```bash
{   // tasks.json
	"version": "2.0.0",
	"options": {
		"cwd": "${workspaceFolder}/build"
	},
	"tasks": [
		{
			"type": "shell",
			"label": "cmake",
			"command": "cmake",
			"args": [
				".."
			]
		},
		
		{
			"label": "make",
			"group": {
				"kind": "build",
				"isDefault": true
			},
			"command": "mingw32-make.exe",
			"args": [
			]
		},
		{
			"label": "Build",
			"dependsOn": [
				"cmake",
				"make"
			]			
		}
	],
}



  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-03-04 15:48:03  更:2022-03-04 15:48:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/4 17:17:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码