vscode一键配置C/C++多个C及CPP文件编译与tasks.json和launch.json原理

vscode一键配置C/C++多个C及CPP文件编译与tasks.json和launch.json原理vscode配置环境及配置原理搜了很多的教程,发现要么教程太老,给的配置信息里面有些参数都不能使用了,要么就是直接扔下自己的配置信息就没了,不知道咋来的,也不能拿过来直接用,让我这种小白无从下手,于是就摸索整理一下,帮助一下像我这样小白刚入手的小伙伴们。原理我觉得最重要的就是我们要明白各个配置文件是干嘛的,它是怎么被vscode使用的,明白这一点,那么自己就可以比较清晰参数该怎么改,应该改哪些参数,而不是拿着别人的配置文件,无从下手。配置文件基本的原理(只是原理,不是咋配置的):vscode使用的最

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

vscode下Cmake配置及C/C++环境配置原理

vscode一键配置配置C/C++/Cmake/make调试环境及配置原理

搜了很多的教程,发现要么教程太老,给的配置信息里面有些参数都不能使用了,要么就是直接扔下自己的配置信息就没了,不知道咋来的,也不能拿过来直接用,让我这种小白无从下手,于是就摸索整理一下,帮助一下像我这样小白刚入手的小伙伴们。

嫌每次配置麻烦的小伙伴,后文放有一键创建vscode下的c/c++的cmake项目小工具,使用小工具生成的项目,可以自己在完成修改后配成一个通用项目,直接备份一份通用项目后,以后就可以直接使用自己修改后的模板,只需要更改一下工程名称就可以了。

原理

我觉得最重要的就是我们要明白各个配置文件是干嘛的,它是怎么被vscode使用的,明白这一点,那么自己就可以比较清晰参数该怎么改,应该改哪些参数,而不是拿着别人的配置文件,无从下手。配置文件基本的原理(只是原理,不是咋配置的):

vscode使用的最基本的两个配置文件是tasks.jsonlaunch.json文件(这两个文件一般都是在vscode当前打开的文件夹下的 .vscode 文件夹中,没有可以手动创建,只要位置正确就可以生效)。

launch.json: 这个配置文件是告诉vscode如何来启动调试你的代码程序的,这其中包括你的程序在哪个位置,你用什么工具来调试,调试的时候需要给调试工具传什么参数等。
tasks.json: 这个配置文件是用来执行你预定的任务的,比如说你修改了你的代码,调试之前,肯定要重新生成新的程序后再调试,那么你就可以配置它告诉vscode怎么重新生成这个新的程序。(task.json不是必须文件,比如python调试,可以不用提前编译)

vscode就是先跑 tasks.json 任务,再跑 launch.json。

说明一点: vscode调用任务是根据lable标签识别的(文章后面有说明)。

"lable": "startRun"

Jetbrains全家桶1年46,售后保障稳定

那么启用这个任务就是启用startRun。

具体配置

我这里的配置都没有用到VS相关,用的是跨平台的g++、gcc,在Windows上面就是安装MinGW,我用的是MinGW64(gcc version 8.1.0 x86_64)。

(2022-10-21更新)
如果你使用的是MSVC编译器,道理都是大同小异,MSVC我也配置过,都是可以的。下面是我写的一个简单的例子,供大家参考(文章教程是gcc,这里仅供想使用MSVC编译器的小伙伴查看,gcc也可以参考部分内容),不使用这个的可以跳过。
01.launch.json

{ 
   
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        { 
   
            "name": "DefaultTest",
            "type": "lldb", 
            "request": "launch",
            "program": "${workspaceFolder}/build/${workspaceRootFolderName}_test",
            "osx": { 
   
                "name": "TestOSX",
                "type": "lldb", 
                "request": "launch",
                "program": "${workspaceFolder}/build/${workspaceRootFolderName}_test",
            },
            "linux": { 
   
                "name": "TestLinux",
                "type": "cppdbg",
                "request": "launch",
                "program": "${workspaceFolder}/build/${workspaceRootFolderName}_test",
                "MIMode": "gdb",
                "setupCommands": [
                    { 
   
                        "description": "gdb print",
                        "text": "-enable-pretty-printing",
                        "ignoreFailures": true
                    }
                ],
            },
            "windows": { 
   
                "name": "TestWindows",
                "type": "cppvsdbg",
                "request": "launch",
                "program": "${workspaceFolder}/build/Debug/${workspaceRootFolderName}_test"
            },
            "args": [], 
            "cwd": "${workspaceFolder}",
            "preLaunchTask": "CmakeBuild",
        },
    ]
}


02.settings.json

{ 
   
    "editor.unicodeHighlight.allowedLocales": { 
   
        "zh-hans": true,
        "zh-hant": true
    },
    "files.autoGuessEncoding": true,
    "terminal.integrated.defaultProfile.windows": "PowerShell",
    "terminal.integrated.profiles.windows": { 
   
        "PowerShell": { 
   
            "source": "PowerShell",
            "args": ["chcp 65001; PowerShell -NoLogo"]
            //"args": ["-NoExit", "-Command", "chcp 65001"],
            //"icon": "terminal-powershell"
        },
    },
}

03.tasks.json

{ 

"tasks": [
{ 

"label": "CMakeConfig",
"type": "shell",
"command": "cmake",
"args": [
"${workspaceFolder}"
],
"options": { 

"cwd": "${workspaceFolder}/build"
},
"dependsOn": [
"BuildDirectory"
],
"problemMatcher": []
},
{ 

"label": "CmakeBuild",
"type": "shell",
"command": "cmake",
"args": [
"--build",
"${workspaceFolder}/build",
"--config",
"Debug",
"-j",
"10"
],
"options": { 

"cwd": "${workspaceFolder}/build"
},
"problemMatcher": [],
"group": { 

"kind": "build",
"isDefault": true
}
},
{ 

"label": "BuildDirectory",
"type": "shell",
"command": "mkdir",
"args": [
"-p",
"build"
],
"windows": { 

"args": [
"-Force",
"build"
]
},
"options": { 

"cwd": "${workspaceFolder}"
},
"problemMatcher": []
},
{ 

"label": "UnixClear",
"type": "shell",
"command": "rm",
"args": [
"-rf",
"build"
],
"options": { 

"cwd": "${workspaceFolder}"
},
"problemMatcher": []
},
{ 

"label": "WindowsClear",
"type": "shell",
"command": "Remove-Item",
"args": [
"-Path",
"${workspaceFolder}/build",
"-Recurse"
],
"options": { 

"cwd": "${workspaceFolder}"
},
"problemMatcher": []
}
],
"version": "2.0.0"
}

如果只是跑单个的C/C++文件

直接安装C++插件后,就可以直接写代码跑了。(2020/12/09更新)
点击左边扩展商店搜索c++。
在这里插入图片描述

如果有多个文件或项目文件

如果你写的代码有多个文件,或者使用第三方库的时候有多个代码文件,这里就是使用makefiles构建程序了。

makefiles是用来组织管理不同文件的编译链接顺序等用,可以简单理解为gcc/g++命令后面那一大串参数都放这里了,不用每次手敲,Cmake就是用来生成makefiles的,因为makefiles靠手写也是很麻烦的。

思路:

1.cmake生成makefiles
2.make编译
3.调试

当然上面的步骤,我们是配置到tasks.json中自动执行的。

上面的make命令就是MinGW安装目录下bin目录下的的mingw32-make.exe,在tasks.json中配置此命令。

一、先看这个launch.json文件,这个文件基本框架是vscode自动生成的,具体方法是:菜单栏==>运行==>打开配置文件。手动创建也可,上文有说明,内容按下面填就行。

注释中的举例部分内容来自:这里

{ 

// 使用 IntelliSense 了解相关属性。 
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{ 

"name": "g++.exe - 生成和调试活动文件",
// type 告诉vscode编译器的类型,我用的MinGW64也就是g++,这里是cppdgb
// 这个是规定的,不是随便写,比如msvc编译器就是cppvsdbg
"type": "cppdbg", 
"request": "launch",
// program 这个是你的可执行程序位置,这里可以根据自己的tasks.json生成
// 程序的位置自定义修改,等会参照后面的tasks.json内容
"program": "${workspaceFolder}\\build\\${workspaceRootFolderName}.exe",
// ${xxxx}是vscode内置的变量,可以方便获取到需要的路径或者文件名,
// 具体什么变量参考别人的博客,
// 这里列举一部分
// ${workspaceFolder} :表示当前workspace文件夹路径,也即/home/Coding/Test
// ${workspaceRootFolderName}:表示workspace的文件夹名,也即Test
// ${file}:文件自身的绝对路径,也即/home/Coding/Test/.vscode/tasks.json
// ${relativeFile}:文件在workspace中的路径,也即.vscode/tasks.json
// ${fileBasenameNoExtension}:当前文件的文件名,不带后缀,也即tasks
// ${fileBasename}:当前文件的文件名,tasks.json
// ${fileDirname}:文件所在的文件夹路径,也即/home/Coding/Test/.vscode
// ${fileExtname}:当前文件的后缀,也即.json
// ${lineNumber}:当前文件光标所在的行号
// ${env:PATH}:系统中的环境变量
"args": [], 
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
// 调试器的路径
"miDebuggerPath": "D:\\program\\mingw64\\bin\\gdb.exe",
"setupCommands": [
{ 

"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
// preLaunchTask 表示在 执行调试前 要完成的任务
// 比如这里 要完成 makeRun 这个tasks任务(重新生成程序)
// 这里的 makeRun 是 tasks.json 中 lable 标记的任务名称
"preLaunchTask": "makeRun",
}
]
}
// 上面没有注释的部分基本都是默认生成的,可以不用更改的部分

二、再来看tasks.json文件
tasks中可以有多个任务,在一个列表中保存,根据自己需要添加或删除。

{ 

"tasks": [
{ 

// 任务一: 创建 build 文件夹
"type": "shell",
"label": "CreateBuildDir", // lable 标记任务名称
"command": "mkdir",  // 命令
// 传给上面命令的参数,这里是传给 Unix 系统的参数,windows下稍有不用,下边有
"args": [
"-p",
"build"
], 
"windows": { 

"options": { 

"shell": { 

"executable": "powershell.exe"
}
},
"args": [   // 对于windows系统,传的参数
"-Force",
"build"
]
},
"options": { 

"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
},
// 任务二: Cmake
// 在 build 文件夹中调用 cmake 进行项目配置
// 如果想配置比如 release 还是 debug 可以添加参数或者在
// CMakeLists.txt中设置也行
{ 

"type": "shell",
"label": "cmakeRun", // 给这个任务起个名字
// 这里的cmake,用我后面小程序创建的结果填的是全路径,
// 命令写全路径,则路径中不能包含带空格
// 如果你添加了环境变量,那么直接填写命令即可,也不会有
// 路径是否包含空格的问题(下面的命令同理)
"command": "cmake",
"args": [
"-DCMAKE_MAKE_PROGRAM=E:\\Resource\\mingw64\\bin\\mingw32-make.exe", // MinGW目录下bin目录下的mingw32-make.exe
"-G",
// 不使用-G "Unix Makefiles" 参数可能会编译成了VS用的工程文件
// 之所以三个斜杠,是因为vscode终端自己还要转义一次
// 2021-01-21更新:我在32位的win7上发现,vscode自己又不转义了
// 所以如果以下三个斜杠不行的话,大家手动改成一个斜杠就好,即\"Unix Makefiles\"
// 后面我给的小程序默认写的是3个
"\\\"Unix Makefiles\\\"",  
"../"  // ../ 表示build文件夹的上级目录,CMakeLists.txt就放在上级目录中
],
"options": { 

"cwd": "${workspaceFolder}/build"
},
"dependsOn":[
"CreateBuildDir"  // 表示在 创建目录 任务结束后进行
]
},
// 任务三: make编译
{ 

"type": "shell",
"label": "makeRun",
"command": "mingw32-make",  // 这个也是MinGW目录下bin目录下的mingw32-make.exe,如果添加了环境变量,这里直接写mingw32-make.exe
"args": [],
"options": { 

"cwd": "${workspaceFolder}/build"
}, // 注意这里是编译到了项目文件夹下的 build 文件夹里面,这里就解释了
// 为什么 launch.json 中 program 路径要那么设置了。
"dependsOn":[
"cmakeRun"  // 表示在Cmake任务结束后进行
]
},
],
"version": "2.0.0"
}

配置好了,开心的写代码吧。

注意事项: 该文配置的环境是这样的,vscode打开的文件夹要是项目的根文件夹,然后调试后会在根文件夹下创建build文件夹,在这里面存放cmake和make后产生的文件,cmake使用的CMakeLists.txt(在vscode中可以安装Cmake插件,有两个,可以提示你怎么写这个文件,具体教程可以百度,基本用法很简单)要放在项目根目录下。

我个人的示例:
1.我的目录长这样,我的项目名称就是CPP(其实就是根目录的名字),然后符合注意事项的内容。
在这里插入图片描述
2.这个是我的CMakeLists.txt示例
在这里插入图片描述
3.这是我启动调试后的终端输出
在这里插入图片描述
4.多出了build文件夹
在这里插入图片描述
5.结果
在这里插入图片描述

一键创建项目(2022-10-07更新)

如果觉得,每次这样子配置太麻烦,本人写了一个小工具,可以一键创建项目,创建完成之后,直接用vscode打开该项目的根文件夹就可以直接编译运行了。该程序是用C++写的,QT框架,所以文件有点大(15M),不过这个文件不需要任何环境依赖,解压就可以直接运行,比较方便。

VSCode-C/C++项目一键创建程序( 2022-10-07更,修复了配置小错误和界面提示错误)
因为只是个小工具,所以没有考虑任何美化,如果生成失败了,自主检查一下填写的路径是否正确,路径结尾是否有多余的空格等。

1.主界面

可以自动获取你的编译器路径,如果不对可以手动更改。
更新的版本已重写,为了兼容性(32位,64位及系统不同的原因),取消了自动获取编译器位置功能,统一改成了只能手动填写或者手动选择(2, 3, 4三项路径不能包含空格,否则会有问题,最后一个项目路径可以包含空格)。
在这里插入图片描述
2.这里有部分说明信息。
(2021/03/07更新)
在这里插入图片描述

3.这是执行目录后生成的文件

在这里插入图片描述

这是配置信息:

在这里插入图片描述

最终说明

说明一: 以上生成的文件,如果不能正确使用,请查看上文中tasks.json中的Unix Makefiles说明即可,这是不同机器有不同的选择,大家根据自己的情况去修改一下就好。(2021-01-21更新)

说明二: (2021-01-21更新)大家如果写多个C/CPP文件,需要将你添加的文件在CMakeLists.txt中添加,也就是如下位置:
在这里插入图片描述
多个文件,用空格隔开就可以了,CMakeLists.txt其他部分常用功能示例如下:

# cmake 的版本要求
cmake_minimum_required(VERSION 3.14) 
# 项目名称
project(myCppPractice)
# 设置 Debug 模式
set(CMAKE_BUILD_TYPE "Debug")
# 设置源文件根目录,并设置别名为DIR_ROOT
aux_source_directory(. DIR_ROOT)
# 设置myCppPractice版本标准
set(CMAKE_CXX_STANDARD 14)
# 项目包含哪些 文件
add_executable(${ 
PROJECT_NAME} main.cpp Actor.cpp AnimSpriteComponent.cpp BGSpriteComponent.cpp
Component.cpp Game.cpp Math.cpp Ship.cpp SpriteComponent.cpp)
# 添加目录下的文件,然后在add_executable中添加${ 
DATA_SRC}
set(DATA_SRC src/Data.cpp)
# 声明三方库位置路径
set(SDL2_DIR D:/program/resource/x86_64-w64-mingw32)
# headers头文件位置-多个用空格隔开
include_directories(${ 
SDL2_DIR}/include)
# 推荐使用find_package和find_library寻找共享库的绝对路径,再传给target_link_libraries使用。
find_library(SDL2MAIN SDL2main ${ 
SDL2_DIR}/lib)
find_library(SDL2 SDL2 ${ 
SDL2_DIR}/lib)
find_library(SDL2IAMGE SDL2_image ${ 
SDL2_DIR}/lib)
# 链接库
target_link_libraries(${ 
PROJECT_NAME} mingw32 ${ 
SDL2MAIN} ${ 
SDL2} ${ 
SDL2IAMGE})
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/203630.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Vuex的使用(五)——mapGetters的定义和用法[通俗易懂]

    Vuex的使用(五)——mapGetters的定义和用法[通俗易懂]参考文档:https://vuex.vuejs.org/zh/guide/当需要在组件中使用多个getters时,可以利用mapGetters批量生成计算属性(新增文件路径为src\components\componentE.vue),代码如下:mapGetters用法gettersinvuex:{{param2}}引用上面创建的component-e查看效果(修改文件路径为src\main.js),代码如下:imp

  • buck降压电路解析

    buck降压电路解析1.拓扑模型如下2.需要的元器件如下:元器件:开关管T、续流二极管D、储能电感L、滤波电容C、负载电阻R输入电压:Ui输出电压:Uo特性:Ui>Uo3.三种工作模式BCM、CCM、DCM3.1CCM–电感电流连续导通模式3.2当Imin减小到零时,电路由CCM模式进入BCM—电感电流临界导通模式3.3DCM—电感电流非连续/断续导通模式4.举例子LM2576/2596下图中的R1/R2阻值一般是k级别电阻,100k左右,目的是减少功耗5.常见的厂商TI、MP

  • 请问:关于织梦dedecms点击导航上的父栏目进去默认显示第一个子栏目的列表的问题…

    请问:关于织梦dedecms点击导航上的父栏目进去默认显示第一个子栏目的列表的问题…

  • MyBatis工作原理

    在学习MyBatis程序之前,需要了解一下MyBatis工作原理,以便于理解程序。MyBatis的工作原理如下图1)读取MyBatis配置文件:mybatis-config.xml为MyBatis的全局配置文件,配置了MyBatis的运行环境等信息,例如数据库连接信息。2)加载映射文件。映射文件即SQL映射文件,该文件中配置了操作数据库的SQL语句,需要在M…

  • getParameter方法的用法[通俗易懂]

    getParameter方法的用法[通俗易懂]html核心代码<body><fontsize=”5″color=”blue”>圆面积计算</font><br><formaction=”home/CCarea”method=”post”> 请输入半径r:<inputtype=”text”name=”radius”v…

  • 【ML】支持向量机(SVM)从入门到放弃再到掌握

    【ML】支持向量机(SVM)从入门到放弃再到掌握朋友,你通过各种不同的途经初次接触支持向量机(SVM)的时候,是不是会觉得这个东西耳熟能详,感觉大家都会,却唯独自己很难理解?每一次你的老板或者同仁让你讲解SVM的时候,你觉得你看过这么多资料,使用过这么多次,讲解应该没有问题,但偏偏在分享的时候结结巴巴,漏洞百出?每一次机器学习相关的面试在问到支持向量机(SVM)的时候,尽管你觉得你都准备好了,可是一次又一次败下阵来,以至于觉得问那些问题…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号