[全网最全 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配置界面的图

 大同小异


 目录书签导航

  1. 下载安装(2个软件)
  2. 配置MSYS2环境     && 换源
  3. 安装Mingw-w64编译工具
  4. 变量配置
  5. 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 #include 
2 #include 
3 
4 int main(void) {
5     printf("HelloWorld!");
6     system("pause");
7     return 0;
8 }
test.c

安装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. 点击 配置图标,可选方案有如下:

  1.  C++ (GDB/LLDB) (to use GDB or LLDB)
  2. 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"了吗?

这个配置的值就要和之前在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


微软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 #include 
 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 }
HelloWorld.c

(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  请看链接:   想了解更多有趣的东西,可以看我其他博文,虽然没有这篇好,但是也导出了很多探索路线

拥有思想理念地去编程,会给你带来一个不一样、精彩的世界观

附上:

拓展学习(就算不学也建议仔细了解一下):

  1. 习惯常用的命令操作,理解图形化的思想(做到不讨厌命令行也不小看图形化,把命令行和图形化操作看作同一地位,这样的思维对 个人进步 和 工程开发  大有脾益)
  2. gdb           是C/C++调试器,也是众多衍生语言(如Java)的调试器基础,学会gdb,就能熟悉各种编程语言、IDE的调试
  3. Makefile    一种针对复杂工程自动化编译的脚本文件,有利于理解各种IDE原理
  4. git             分布式版本控制工具
  5. Linux        因为这些gcc、gdb都是从Linux移植过来的,Windows原生编译调试器好像只有MSVC
  6. 学会使用第三方的库,如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