[全网最全 C语言] VSCode 安装与配置(MSYS2的mingw-w64/GCC 编译环境)
本文地址: https://www.cnblogs.com/yucloud/p/vs_code_config.html
力求完美、详细,望各位留言指点
目前已经开始添加原理解释,希望大家能分享一些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)
2023年消息:VSCode的C/C++插件现在只需要在操作系统安装好gcc和gdb工具链,然后按下F5或者右上角的运行按钮,选择第一个或者第二个就行了
请耐心看完,这能让您充分了解和理解什么是IDE, 【调试、运行和命令行】,以及系统与程序间的关系
如果只是想找三个文件的配置方法,请点下面导航。(其实这三个文件配置并不难,难的是没用过gcc g++ gdb,当你稍微地使用之后,配置自然是水到渠成)
基本上各平台配置内容的最大差异在于那个include路径,只要写对路径,其他都是小问题
本文理论上全平台GCC通用,其他编译平台请自行变通,毕竟会使用其他平台已经不是新手了。
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配置界面的图
大同小异
以下是正文开始
目录书签导航
- 6. 让Msys2更顺手
- 强烈建议先初步学会使用gcc(mingw64)等命令,这样配置才不会一脸懵逼
1,下载安装(2个软件)
VS Code官网:https://code.visualstudio.com/ ps: system installer和user installer的区别就在用于为所有用户/单用户安装。
MSYS2官网:https://www.msys2.org 我电脑系统是Windows 10 x64,所以选择
2,配置Msys2环境
请搭配这篇文章使用本博文: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
3,安装Mingw-w64编译工具
再安装 Mingw64 编译工具链
pacman -S --needed base-devel mingw-w64-x86_64-toolchain
安装后打开开始菜单里MSYS2 64bit 的"MSYS MinGw 64-bit“,输入gcc -v回车查看gcc版本号,正常则代表安装成功,然后关闭即可
这时就已经可以使用 gcc 和 make 命令了。
可选
当然还有其他可选的常用开发环境与工具(初学者不建议,有需要的进阶用户可以安装)
pacman -S base-devel git mercurial cvs wget p7zip perl ruby python2
32位Mingw-w64:
pacman -S mingw-w64-i686-toolchain
64位Mingw-w64:
pacman -S mingw-w64-x86_64-toolchain
4,变量配置
打开系统环境变量配置
可以用:win键+右上角的pause键,笔记本用Win+Fn+Pause,或者直接右击我的电脑-属性
然后点高级系统设置-——环境变量(N)
双击系统变量的Path,新建
C:\msys64\mingw64\bin
再添加环境变量 HOME 为
C:\msys64\home\<用户名>
据说这个变量很有用,后面配置要多次用到。(注意:<用户名>尖括号表示该内容要填你自己的安装用户名,如我该目录下的是kui就应该填C:\msys64\home\kui)
(这里的C:\msys64是Msys2的默认安装路径,如果路径不一样,请自行变通)
重启一下电脑让变量生效(2018年: 变量好像是及时生效的,只要重开cmd窗口就行,变量会在新窗口里生效)
然后打开cmd,输入(回显中有HOME和Path变量即可)
set |findstr msys64
或者
set HOME && Path
再输入(回显中有版本号即可)
gcc -v
那么变量配置完成
Deepin/Ubuntu/Linux用户
如果你使用的是Deepin/Ubuntu/Linux,那么安装就非常简单了
#安装好gcc工具链和GDB调试器 sudo apt install -y build-essential gdb
其他Linux发行版请自行搜索如何安装 gcc和gdb,例如Opensuse用户直接百度: Opensuse 安装gcc gdb
5,VS Code与MinGw搭配使用
如果你不是Windows而是Ubuntu/Linux用户,请用 sudo apt install -y build-essential gdb 安装好gcc工具链和GDB调试器
(没有GDB调试器的话,C/C++插件不会识别到配置)
我换了皮肤,界面不一样而已。截图时的版本是 VSCode 1.76.1 C/C++插件版本是v1.15.1 (2023-4-6更新的截图)
然后就会发现调试和运行都可以了
如果发现配置错了或者运行不了,可以删掉.vscode文件夹再来一遍
6,手动配置法,以下是旧版插件才需要的配置
新版不需要这么麻烦了请跳过。这里是为旧版插件朋友提供的
请搭配VS Code官网使用说明:https://code.visualstudio.com/docs/languages/cpp
因为官网有可能更新,且本文不一定完全正确,因此建议读者分屏(WIn键+方向键)同时阅读本文和官网说明
(看不懂英文可以挂梯子使用谷歌网页翻译)
打开Vscode,会提示你打开一个工作目录(菜单栏 File - Open folder选择你想要项目放置的工作目录即可)
然后新建文件,写好c语言的helloword代码并保存为test.c
注意:文件名和路径目录名一般不能有中文
1 #include <stdio.h> 2 #include <stdlib.h> 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写的)]
修改内容如下(注意,这个文件不允许使用注释):
{ "configurations": [ { "name": "Win32", "includePath": [ "${workspaceFolder}/**", "D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/include", "D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../include", "D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/include-fixed", "D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/include" ], "defines": [ "_DEBUG", "UNICODE", "_UNICODE" ], "windowsSdkVersion": "10.0.19041.0", "cStandard": "c17", "cppStandard": "c++17", "intelliSenseMode": "windows-gcc-x64", "compilerPath": "D:/msys64/mingw64/bin/gcc.exe" } ], "version": 4 }
更新一下说明:当需要第三方SDK如Npcap/WinPcap时,请在includePath自行添加
另外Linux常用的头文件getopt.h位置在
"C:\\msys64\\mingw64\\x86_64-w64-mingw32\\include"还有,VSCODE和VS一样支持引用环境变量(系统环境变量和VSCODE内置变量)VSCODE内置变量如 "${workspaceFolder}/**", 这句是默认的include配置内容,会指定搜索工作目录下的头文件等
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" } ] }
[这部分完全是 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”,
会生成第三个文件:
修改内容如下:
{ "tasks": [ { "type": "cppbuild", "label": "C/C++: gcc.exe build active file", "command": "D:/msys64/mingw64/bin/gcc.exe", "args": [ // "-std=c11" "-fexec-charset=GBK", "-Wall", "-static-libgcc", "-g", "${file}", "-o", "${fileDirname}\\${fileBasenameNoExtension}.exe" ], "options": { "cwd": "D:/msys64/mingw64/bin" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true }, "detail": "Task generated by Debugger." } ], "version": "2.0.0" }
[完全是 gcc命令行工具 的知识]
然后,看到"label"了吗?
这个配置的值就要和之前在launch.json里的那个
"preLaunchTask"的值一样,例如:"preLaunchTask": "gcc" // [launch.json文件里的]"label" : "gcc" // [tasks.json 文件里的]因为preLaunchTask意思是:在此之前启动指定task
当然你可以变通使用 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
“项目目录”
+.vscode目录
++ c_cpp_properties.json
++ launch.json
++ tasks.json
+多个c源文件*.c
按下编译快捷键F5会编译当前打开的单个文件(比如同时开了1.c 2.c但是光标选中的是2.c,那么就只编译2.c)
这样就初步配置完成了,如果需要更高级的功能,请查看微软Visual Studio Code的文档。
每次使用都需要先打开“项目”目录,然后该IDE会读取.vscode子目录配置文件。
因此我们可以将配置好的.vscode目录备份起来,以后要新建“项目”,直接就把该目录放置到“项目”目录,然后打开"项目"目录即可。
当然,这三个文件也适用于VS2017最新版 对 Visual Studio 中 C++ 生成系统的“打开文件夹”支持 | Microsoft Docs
附上:
VSCode插件之Code Runner (只能run不能调试)
附上Code Runner解决运行程序中文乱码问题的方案
6,让Msys2更顺手
Msys2 更舒适的配置https://www.jianshu.com/p/0e24ee498f2b
PS. VScode编译单个源文件特别方便,用来和VS2017互补非常棒。(虽然VS2017新版也实现了和c/cpp插件一样地利用JSON自动化编译)
最后附上:Cygwin、MinGw、mingw-w64,MSys msys2区别与联系 - zengkefu - 博客园
其实这三个文件的配置,把鼠标悬浮在配置上面,vscode会告诉你作用和值范围,这些都很简单的,难的是自身英文水平 和使用搜索引擎的能力
假如把vscode给的那短短的docs都读懂,把c语言gcc编译器的参数、预编译命令等知识都搜索一遍,那配置就轻而易。(当然我都做不到,或者说不愿意去做,emmm......)
使用 Makefile
方式1. 新插件,VSCode官方团队推出专为Makefile工程解析的 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 } } ] }
# 模块驱动,必须以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
glibc问题(Linux)
如果你在Linux上配置VSCode,单步调试时就会发现一个报错:Unable to open 'malloc.c': File not found (file:///build/glibc-kAz5Pl/glibc-2.27/malloc/malloc.c). 之类的提示,
注意: 这里的 glibc-kAz5Pl 最后一个字母是小写的 L (即 jklmn 的 l )
记得安装 gdb 哦(apt install gdb && apt-mark auto gdb)
解决方案有两种:
1. [在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 渐渐不再维护
解答
1. MSYS2 是什么,它和 Cygwin 的区别?
答,MSYS2更好,请看官网介绍:
关于学习的理念
学习编程,最好就是对工具和整体都有一个正确、完整的理解。从命令行理解是最好的,因为你能一步步地理解程序执行的过程,再加以调试,基本上整个软件层面都能透彻理解。
比如HelloWord.c 你可以开始使用命令行理解它
HelloWorld.c1 #include <stdio.h> 2 // 这是一个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 请看链接:C程序获取命令行参数 想了解更多有趣的东西,可以看我其他博文,虽然没有这篇好,但是也导出了很多探索路线
拥有思想理念地去编程,会给你带来一个不一样、精彩的世界观
拓展学习(就算不学也建议仔细了解一下):
- 习惯常用的命令操作,理解图形化的思想(做到不讨厌命令行也不小看图形化,把命令行和图形化操作看作同一地位,这样的思维对 个人进步 和 工程开发 大有脾益)
- gdb 是C/C++调试器,也是众多衍生语言(如Java)的调试器基础,学会gdb,就能熟悉各种编程语言、IDE的调试
- Makefile 一种针对复杂工程自动化编译的脚本文件,有利于理解各种IDE原理
- git 分布式版本控制工具
- Linux 因为这些gcc、gdb都是从Linux移植过来的,Windows原生编译调试器好像只有MSVC
- 学会使用第三方的库,如npcap、Mysql的C api等(需要相关的知识体系,如网络或数据库的一点点知识)
如果想写命令行程序,见 main函数的参数(int argc,char *argv[]) 或参考书籍《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