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"
			]			
		}
	],
}



在Visual Studio Code (VSCode) 中使用g++编译多文件项目,你需要做的是设置合适的构建系统和配置。以下是基本步骤: 1. **安装C/C++插件**: 首先,确保已安装了C/C++ for Visual Studio Code插件。可以通过VSCode的扩展市场搜索并安装"ms-vscode.cpptools"。 2. **设置工作区目录**: 将源代码文件组织成清晰的文件夹结构,例如,你可以有`src`、`include`等文件夹分别存放源文件和头文件。 3. **创建CMakeLists.txt(可选)**: 如果项目较大,推荐使用CMake管理编译流程。在一个名为`CMakeLists.txt`的文件中,定义项目的构建规则,例如添加源文件和链接依赖。 4. **编写配置**: 在VSCode的工作区根目录下,打开用户settings.json 或者 workspace settings.json(取决于是否需要所有工作区共享设置),添加C++编译器设置: ```json { "tasks": { "version": "2.0.0", "configurations": [ { "name": "C++gcc build", "type": "cppbuild", "request": "launch", "program": "${fileDirname}/${fileBasenameNoExtension}", "args": ["${command}", "-o", "${fileDirname}/${fileBasenameNoExtension}"], "cwd": "${workspaceFolder}", "preLaunchTask": "build" } ] }, "c_cpp_properties": { // 这里配置g++路径和其他编译选项,例如: "configurations": [ { "name": "Mac", "macOS": { "compilerPath": "/usr/bin/g++" }, "includePath": [ "${workspaceFolder}/**" ], "defines": [] } ] } } ``` 5. **编译任务**: - 创建一个新的任务(Tasks > Configure Task...),选择"cppbuild"类型。这里可以配置g++作为编译器,指定源文件和输出位置。 - 可以通过快捷键`Ctrl+Shift+B`运行预设的编译任务,或者在终端窗口直接使用`cmake . && make`命令。 6. **调试支持**: 若要进行调试,还需要配置相应的调试配置。在`launch.json`中,指定启动程序和调试器的行为。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DogDog_Shuai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值