[全网最全 C语言] VSCode 安装与配置(MSYS2的mingw-w64/GCC 编译环境)
本文地址:
力求完美、详细,望各位留言指点
目前已经开始添加原理解释,希望大家能分享一些gcc gdb C语言等方面优秀链接
本博文被多次转载,而转载文章并不会更新,所以请以本博文为准。另为了表明本博文为原创且有更新,因此博文标题时有变动。
后续会慢慢增添内容,修正不足。 希望这篇文章能带大家入坑。
------------- 博客园 蓝天上的云℡ YuCloud https://yucloud.cnblogs.com
Ps.
2021年8月28日 笔试时用了一下,发现按本文配的,F5选G++时候支持C++环境(STL支不支持就不清楚,没试过)
2021年8月2日 更新文章内容,按照 MSYS2 官方教程和VSCode最新版本修正
2021年消息: VSCode官方团队已推出 Makefile Tools 插件,从此支持Makefile项目(包括Linux Kernel) 附上:官方使用说明
2019年消息:VSCODE支持全局配置,C/Cpp插件也支持UI界面设置。(但本质是通过图形界面配置JSON)
官方Issues 原话如下图
请耐心看完,这能让您充分了解和理解什么是IDE, 【调试、运行和命令行】,以及系统与程序间的关系
如果只是想找三个文件的配置方法,请点下面导航。(其实这三个文件配置并不难,难的是没用过gcc g++ gdb,当你稍微地使用之后,配置自然是水到渠成)
基本上各平台配置内容的最大差异在于那个include路径,只要写对路径,其他都是小问题
本文理论上全平台GCC通用,其他编译平台请自行变通,毕竟会使用其他平台已经不是新手了。
怎么查看gcc默认的include路径 :
Linux下是 gcc -v -x c -E /dev/null
Windows下是 gcc -v -x c -E NUL
然后找到gcc编译流程的日志里输出内容中的 #include <...> search starts here:
这里可以参考韦东山的嵌入式编译视频(GCC通用的,分析日志):
https://www.bilibili.com/video/BV1w4411B7a4?p=47&t=470
附上新版UI配置界面的图
大同小异
目录书签导航
- 下载安装(2个软件)
- 配置MSYS2环境 && 换源
- 安装Mingw-w64编译工具
- 变量配置
- VS Code与MinGw搭配使用
-
- c_cpp_properties.json
- launch.json
- tasks.json
- 配置文件的目录结构
- 6. 让Msys2更顺手
- 使用 Makefile
- glibc问题(Linux)
- 解答
- 在VSCode中使用Git
- 关于学习的理念
- 强烈建议先初步学会使用gcc(mingw64)等命令,这样配置才不会一脸懵逼
- 以下教程开始了,上车(fxxk car)
https://code.visualstudio.com/ ps: system installer和user installer的区别就在用于为所有用户/单用户安装。
MSYS2官网:https://www.msys2.org 我电脑系统是Windows 10 x64,所以选择
https://zhuanlan.zhihu.com/p/33751738
MSYS2 是一个在WIndows下提供了 GNU工具链的软件包管理工具,我们用它来很方便地下载安装到最新的编译器
在开始菜单启动MSYS2
输入命令 以更新MSYS2软件列表数据库:(当提示没有更新时即是最新,下同)
pacman -Sy
更新成功会提示你关闭窗口
如果你熟悉vi之类的使用,下载速度太慢,请见 https://mirrors.ustc.edu.cn/help/msys2.html
再同步软件源并更新核心软件包
pacman -Syu
再更新其他基本软件包
pacman -Su
https://code.visualstudio.com/docs/languages/cpp
因为官网有可能更新,且本文不一定完全正确,因此建议读者分屏(WIn键+方向键)同时阅读本文和官网说明
(看不懂英文可以挂梯子使用谷歌网页翻译)
打开Vscode,会提示你打开一个工作目录(菜单栏 File - Open folder选择你想要项目放置的工作目录即可)
然后新建文件,写好c语言的helloword代码并保存为test.c
注意:文件名和路径目录名一般不能有中文
1 #includetest.c2 #include 3 4 int main(void) { 5 printf("HelloWorld!"); 6 system("pause"); 7 return 0; 8 }
再安装C / C ++扩展(没有内置编译器)
- 单击补充工具栏(侧边栏)上的“扩展视图”图标。
- 搜索 C/C++ 。
- 单击“ Install” ,然后单击“ reload to active” 。
然后任选一种方式配置三个脚本:
以下配置提供两种方式,任选其一即可。一种通过UI界面配置(推荐新手使用),一种通过JSON脚本配置
通过图形界面UI配置
在VS Code里按快捷键 左Ctrl+左Shift+P 【是Shift而非Alt】键入并运行
C/C++:Edit Configurations (UI)
会看到这个界面,这里是 与编程语言的编译环境有关 的配置
然后我们要去找到这些信息填入,使得VSCode可以和编译器梦幻联动
快捷键 Win+X 选择 Windows PowerShell(管理员),输入以下命令回车
gcc -v -x c -E NUL
把 #include <...> search starts here: 下面的几个路径复制出来(图中红框标记的)
复制出来去掉空格后填到图中4.的部分
然后其他的
平台:下拉选 Win32
编译器路径:下拉选有gcc.exe的那项
代码感知模式:下拉选择 windows-gcc-x64
includePath: 把 #include <...> search starts here: 下面的几个路径复制出来(图中红框标记的),复制出来去掉空格后填到图中4.的部分
结果如图
然后切换到c源文件那里,
按下F5调试编译,选择 GDB 那项(这个是自动生成调试脚本)
再选第一项(即刚才配置的带gcc.exe的编译器路径)即可 (这个是自动生成编译脚本)
然后会弹出这个界面,不要修改,直接如图 关闭该文件即可
配置完成了,我们测试一下
打个断点再调试
至此配置完成,新手无需再往下看了,进阶用户请继续看下面的
PS. 如果配置配错了,可以删掉 .vscode 目录下的 launch.json 和 tasks.json,然后从第5部分的 5,VS Code与MinGw搭配使用 重新配置
通过JSON脚本配置
1. 用于编译环境的脚本配置(头文件、宏、编译器平台等)
也就是 c_cpp_properties.json,这个脚本用于配置编译环境
在VS Code里按快捷键 左Ctrl+左Shift+P 【是Shift而非Alt】键入并运行
C/C++:Edit Configurations (JSON)
可参考这两篇文章 整理:Visual Studio Code (vscode) 配置C、C++环境/编写运行C、C++(主要Windows、简要Linux) - 一苇以航 - CSDN博客
Visual Studio Code 如何编写运行 C、C++ 程序? - 知乎用户的回答 - 知乎
此时会生成第一个JSON文件:
[ JSON 是一种存储和交换文本信息的语法,类似 XML。但更小更快,便于 JS 解析(因为 VSCODE 是JS写的)]
https://www.cnblogs.com/yucloud/p/10623911.html#use_envir VSCODE内置变量如 "${workspaceFolder}/**", 这句是默认的include配置内容,会指定搜索工作目录下的头文件等 includePath 就是#include预处理器搜索路径 defines 一些定义,用于条件编译,和编译时的flag有关 compilerPath 编译器所在完整路径 c/cppStandard是c/cpp语言标准如c11 c++17 intelliSenseMode 是代码智能感应模式,通过研究关键词去看懂脚本(#无奈脸), 如果不太清楚,可以补一下gcc 相关知识/或者学着用gcc编译(善用搜索引擎)或者看看官方资料, 看不懂也没关系,请慢慢来,不着急(我前几个月看的时候也是完全不懂的,现在看懂很多了)
VSCODE内置变量 https://code.visualstudio.com/docs/editor/variables-reference
[很明显,上面这部分完全是 gcc配置各种路径 的知识] 不过gcc g++编译器是有区别的,如果用C++还是推荐g++
2. 用于启动/调试程序的脚本配置
也就是 launch.json,这个脚本用于启动和调试程序,其中 preLaunchTask 用于调用编译脚本
1. 单击补充工具栏(侧边栏)上的“Debug”图标
2. 点击 配置图标,可选方案有如下:
- C++ (GDB/LLDB) (to use GDB or LLDB)
- C++ (Windows) (to use the Visual Studio Windows Debugger) from the Select Environment drop-down list.
This creates a launch.json file for editing with two configurations:
- C++ Launch defines the properties for launching your application when you start debugging.
- C++ Attach defines the properties for attaching to a process that's already running.
Update the program property with the path to the program you are debugging.
If you want your application to build when you start debugging, add a preLaunchTask property with the name of the build task you created in tasks.json ("build hello world" in the example above).
vscode-cpptools/launch.md at master · Microsoft/vscode-cpptools
然后会生成第二个文件:
官方资料参考
修改内容如下:
{ //${workspaceFolder} - /home/your-username/your-project //${workspaceFolderBasename} - your-project //${file} - /home/your-username/your-project/folder/file.ext // ${relativeFile} - folder/file.ext // ${fileBasename} - file.ext // ${fileBasenameNoExtension} - file // ${fileDirname} - /home/your-username/your-project/folder // ${fileExtname} - .ext // ${lineNumber} - 5 // ${selectedText} - Text selected in your code editor // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "gcc.exe - Build and debug active file", "type": "cppdbg", "request": "launch", "program": "${fileDirname}\\${fileBasenameNoExtension}.exe", "args": [], "stopAtEntry": false, "cwd": "D:/msys64/mingw64/bin", "environment": [], "externalConsole": false, "MIMode": "gdb", "miDebuggerPath": "D:\\msys64\\mingw64\\bin\\gdb.exe", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "C/C++: gcc.exe build active file" } ] }.vscode\launch.json
[这部分完全是 GDB、cmd命令行知识、全局环境变量、利用脚本启动其他exe 的知识]
至于变量的使用,看微软文档:https://code.visualstudio.com/docs/editor/variables-reference
3. 用于编译的Task脚本配置
即 tasks.json,这个脚本用于编译,会在调试之前启动
还是,快捷键 左Ctrl+左Shift+P键入并运行
Tasks: Configure Task
然后点击“Create tasks.json file from templates”再选择“Others”,
会生成第三个文件:
GNU官方文档
然后,看到"label"了吗?
"preLaunchTask": "gcc" // [launch.json文件里的] "label" : "gcc" // [tasks.json 文件里的] 因为preLaunchTask意思是:在此之前启动指定task
这个配置的值就要和之前在launch.json里的那个
"preLaunchTask"的值一样,例如:
当然你可以变通使用 Task 里的 command 和 args,例如改成 make命令之类的以实现调用 MakeFile 编译什么的
既然是入门,就一步步手动来,这样能更了解IDE的执行过程(这也许也是微软想带给我们的),很有价值的。
必应网页翻译VSCode官方文档结果:https://www.translatetheweb.com/?from=en&to=zh-CHS&dl=en&a=https%3A%2F%2Fcode.visualstudio.com%2Fdocs%2Flanguages%2Fcpp
微软Visual Studio Code的文档。
每次使用都需要先打开“项目”目录,然后该IDE会读取.vscode子目录配置文件。
因此我们可以将配置好的.vscode目录备份起来,以后要新建“项目”,直接就把该目录放置到“项目”目录,然后打开"项目"目录即可。
当然,这三个文件也适用于VS2017最新版 对 Visual Studio 中 C++ 生成系统的“打开文件夹”支持 | Microsoft Docs
附上:
在VScode上配置Git - 知乎
VSCode插件之Code Runner (只能run不能调试)
附上Code Runner解决运行程序中文乱码问题的方案
https://www.cnblogs.com/yucloud/p/10259681.html#VSCode_zh
https://www.jianshu.com/p/0e24ee498f2b
PS. VScode编译单个源文件特别方便,用来和VS2017互补非常棒。(虽然VS2017新版也实现了和c/cpp插件一样地利用JSON自动化编译)
最后附上:
其实这三个文件的配置,把鼠标悬浮在配置上面,vscode会告诉你作用和值范围,这些都很简单的,难的是自身英文水平 和使用搜索引擎的能力
假如把vscode给的那短短的docs都读懂,把c语言gcc编译器的参数、预编译命令等知识都搜索一遍,那配置就轻而易。(当然我都做不到,或者说不愿意去做,emmm......)
Makefile Tools 插件,从此不需配置麻烦的环境,只需要写好Makefile需要的变量即可(强烈推荐,支持Linux Kernel工程)
官方使用说明:https://devblogs.microsoft.com/cppblog/now-announcing-makefile-support-in-visual-studio-code/
方式2. 新建 .vscode/tasks.json 并填入以下内容,Makefile 则用项目里需要的,这里贴个 Linux 内核交叉编译的例子
{ "version": "2.0.0", "tasks": [ { "type": "shell", "label": "Build", "command": "cd ${fileDirname} && make", "group": { "kind": "build", "isDefault": true }, "presentation": { "echo": true, "reveal": "always", "focus": true, "panel": "shared", "showReuseMessage": true, "clear": false }, "problemMatcher": [ "$gcc" ] }, { "type": "shell", "label": "clean", "command": "cd ${fileDirname} && make clean", "presentation": { "echo": true, "reveal": "always", "focus": true, "panel": "shared", "showReuseMessage": true, "clear": false } } ] }tasks.json
# 模块驱动,必须以obj-m=xxx形式编写 obj-m = hello.o KDIR = ../../linux CROSS = ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all: $(MAKE) -C $(KDIR) M=$(PWD) $(CROSS) modules clean: $(MAKE) -C $(KDIR) M=`pwd` $(CROSS) clean #VSCode 里按 CTRL+SHIFT+B 即可调用本 Makefile 编译 #也可以在VSCode 菜单里点 Terminal -> Run Task... 或者 Run Build Task
Makefile教程参考:韦东山的嵌入式视频,非常实用易懂,也是大工程里 Makefile 编译常见的写法 https://www.bilibili.com/video/BV1w4411B7a4?p=48
然后在 VSCode 里,按 CTRL+SHIFT+B 即可调用本 Makefile 编译
也可以在VSCode 菜单里点
Terminal -> Run Task... 或者 Run Build Task
[在kali下使用gdb以源码方式调试glibc](推荐,debian系通用)然后把glibc-2.27复制到VSCode要求的目录 build/glibc-kAz5Pl/ 里即可
2. 就是在glibc下载网站搜索build/后面那段glibc-2.27,然后下载并解压到根目录下的build目录(没有就自己建) {没找到gnu的镜像源,只能默默忍受dns污染和墙体的光辉了}
另外参考 怎么查看gcc默认的include路径 :
Linux下是 gcc -v -x c -E /dev/null
Windows下是 gcc -v -x c -E NUL
然后找到输出内容中的 #include <...> search starts here:
然后c_cpp_properties.json的 includePath 如下
"includePath": [ "/usr/lib/gcc/x86_64-linux-gnu/7/include", "/usr/local/include", "/usr/lib/gcc/x86_64-linux-gnu/7/include-fixed", "/usr/include/x86_64-linux-gnu", "/usr/include", "${workspaceFolder}/**" ],
关于glibc(好像又称LLD) :
由于 glibc (GNU C Library) 比 libc(ANSI C Library) 更符合 Linux, 所以 glibc 渐渐成为 Linux 的"标准库", 而 libc 渐渐不再维护
参考: [libc、glibc和glib的关系]
解答
1. MSYS2 是什么,它和 Cygwin 的区别?
答,MSYS2更好,请看官网介绍:
关于学习的理念
学习编程,最好就是对工具和整体都有一个正确、完整的理解。从命令行理解是最好的,因为你能一步步地理解程序执行的过程,再加以调试,基本上整个软件层面都能透彻理解。
比如HelloWord.c 你可以开始使用命令行理解它
1 #includeHelloWorld.c2 // 这是一个HelloWorld演示 3 4 int main(void) { 5 int a = 2019; 6 int c = a - 1949; // 我们在exe里看不到c的值的,因为没有打印出来, 7 //但是我们可以用调试器获取这个值 8 printf("Hello World!"); 9 return 0; 10 } (tab键盘可以部分智能猜测路径/命令补全)
编译方面
请先配置好 MingW64
[cmd] cd /d E:\MySource\ 定位到HelloWorld所在路径E:\MySource\
[cmd] gcc HelloWorld.c -o HelloWorld.exe 使用gcc[Mingw64] 编译HelloWorld.c并输出为HelloWorld.exe
[cmd] ./HelloWorld.exe 在当前已经定位路径,启动HelloWorld.exe,这个就是运行
调试方面
[cmd] gcc -g HelloWorld.c -o HelloWorld.exe 重新编译一次,这次用了-g参数,给exe里加上了调试信息,以便于gdb使用
[cmd] gdb HelloWorld.exe 使用gdb进行调试,由于上面加上了调试信息,所以我们能看到
(gdb) break 1 把断点打在源码第1行,不懂的话可以打help看帮助
(gdb) r Run的简写,运行
(gdb) n Next的简写,下一行
你可以一直执行到int c = a - 1949 的下一行开头即 printf("Hello World!");
(gdb) info local a 查看和变量a相关的值
会显示:
a = 2019
c = 70怎么样,好玩吧!这个就是调试
当然你还可以查看汇编源码:
quit退出
这个过程你已经了解了:
在Windows里双击运行exe时,系统帮你做了什么(当然是简化版,实际上Windows还有一些安全措施之类的)
它先定位到路径,然后才运行。
在计算机里,程序是一步步运行的
所以调试能让你快速理解程序和编程,也能让你看到每个数据的变化
当然还有很多有趣的东西,多线程什么的原来不是真正的同步执行,命令行参数原来离我们学生学C语言并不远,仅仅是学校没有教而我们也不愿意去探索去看国外优秀经典书籍如C Primer Plus 请看链接: 想了解更多有趣的东西,可以看我其他博文,虽然没有这篇好,但是也导出了很多探索路线
拥有思想理念地去编程,会给你带来一个不一样、精彩的世界观
附上:
拓展学习(就算不学也建议仔细了解一下):
- 习惯常用的命令操作,理解图形化的思想(做到不讨厌命令行也不小看图形化,把命令行和图形化操作看作同一地位,这样的思维对 个人进步 和 工程开发 大有脾益)
- gdb 是C/C++调试器,也是众多衍生语言(如Java)的调试器基础,学会gdb,就能熟悉各种编程语言、IDE的调试
- Makefile 一种针对复杂工程自动化编译的脚本文件,有利于理解各种IDE原理
- git 分布式版本控制工具
- Linux 因为这些gcc、gdb都是从Linux移植过来的,Windows原生编译调试器好像只有MSVC
- 学会使用第三方的库,如npcap、Mysql的C api等(需要相关的知识体系,如网络或数据库的一点点知识)
如果想写命令行程序,见 或参考书籍《C Primer Plus 第五版》
本文关键词检索:Windows , Windows10 , Win10 , MSYS2 , MinGw , MinGw-w64 , .vscode , c_cpp_properties.json , launch.json , tasks.json , VScode , 写c , c语言 , Visual Studio Code