美文网首页C语言IT狗工作室C语言&嵌入式
批判性地看待网上的VScode+MSYS2

批判性地看待网上的VScode+MSYS2

作者: 铁甲万能狗 | 来源:发表于2019-12-04 00:41 被阅读0次

    前言

    如果用户打算是在Windows下使用MSYS2结合VSCode作为你的开发环境的话,我觉得不太合适,网上任何关于Windows平台下配置MSYS2+VSCode的教程已经不太适合现在新版本的VSCode。如果你愿意看我为什么这么说,你可以认真往下看。

    错误演绎

    没错下面的步骤都是照搬网上的教程,往下看吧~!!

    下载和安装MSYS2,官网http://www.msys2.org/
    同步软件包的数据库

    pacman -Sy
    pacman -Su
    

    https://hustlei.github.io/2018/11/msys2-for-win.html

    pacman常用命令

    • pacman -Q查看已安装的软件包
    • pacman -S -g查看软件组
    • pacman -Q -g base-devel查看软件组包含的软件
    • pacman -Q -l vim查询软件包的内容
    • pacman -Q -s nettle查询软件所在的包
    • 第1步:安装GCC
      使用pacman -Ss gcc 查看你要安装的软件包名称后,再用具体的软件
      包名称搜索后再安装

    • 第2步:在VScode中设置msys2为默认命令行终端

      首选项,设置

    在设置页面中的搜索框中查找terminal windows关键字,找到设置项并将它按照如下图设置复制到setting.json文件中


    设置选项如下
    {
        "terminal.integrated.shell.windows": "D:/msys64/usr/bin/bash.exe",
        "terminal.integrated.shellArgs.windows": ["-i" ],
        "terminal.integrated.env.windows": {"PATH":"/mingw64/bin:/usr/local/bin:/usr/bin"}
    }
    

    安装gcc编译器和clang编译器

     pacman -S  mingw-w64-x86_64-toolchain
     pacman -S mingw-w64-x86_64-clang
     pacman -S  mingw-w64-x86_64-lldb
    
    ss17.png

    c_cpp_properties.json配置文件

    {
        "configurations": [
            {
                "name": "MinGW",
                "includePath": [
                    "${workspaceFolder}/**",
                    "D:/msys64/mingw64/include/c++/9.2.0",
                    "D:/msys64/mingw64/include/c++/9.2.0/tr1",
                    "D:/msys64/mingw64/include/c++/9.2.0/x86_64-w64-mingw32",
                    "D:/msys64/mingw64/x86_64-w64-mingw32/include"
                ],
                "compilerPath":"D:/msys64/mingw64/bin/clang++",
                "defines": [
                    "_DEBUG",
                    "UNICODE",
                    "__GNUC__=7",
                    "__cdecl=__attribute__((__cdecl__))"
                ],
                "browse": {
                    "path": [
                        "${workspaceFolder}/",
                        "D:/msys64/mingw64/lib/*"
                    ],
                    "limitSymbolsToIncludedHeaders": true,
                    "databaseFilename": ""
                },
                "cStandard": "c11",
                "cppStandard": "c++17",
                "intelliSenseMode": "clang-x64"
            }
        ],
        "version": 4
    }
    

    tasks.json配置文件

    {
        "version": "2.0.0",
        "tasks": [
            {
                "label": "Complie C++ on MinGW",
                "type": "shell",
                "command": "/mingw64/bin/clang++",
                "args": [
                    "${file}",
                    "-o",
                    "${fileDirname}/app/${fileBasenameNoExtension}.exe",
                    "-g",
                    "-std=c++17"
                ],
                "group": {
                    "kind": "build",
                    "isDefault": true
                },
                "presentation": {
                    "echo": true,
                    "reveal": "always",
                    "focus": false,
                    "panel": "shared",
                    "showReuseMessage": true,
                    "clear": false
                },
                "problemMatcher": "$gcc"
            }
        ]
    }
    

    launch.json配置文件

    {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "(lldb) Launch C++ on MinGW",
                "type": "cppdbg",
                "request": "launch",
                "program": "${workspaceFolder}/app/${fileBasenameNoExtension}.exe",
                "args": [],
                "stopAtEntry": false, //设为true时程序将暂停在程序入口处,相当于在main上打断点
                "cwd": "${workspaceFolder}",
                "environment": [],
                "externalConsole":false,
                "miDebuggerPath":"D:\\msys64\\mingw64\\bin\\lldb.exe",
                "MIMode": "lldb",
                "preLaunchTask": "Complie C++ on MinGW",
                "internalConsoleOptions": "neverOpen"
            }
        ]
    }
    

    Ok,我再三确认上面的配置是跟其他文章的设置是前篇一律的,也就是所谓的“正确”性,从其他文章搬过来的,因为我当时为了省事,我没有去直接看微软官方的VScode配置文档,而且直接搜其他同类中文资料,引用它们的内容。我这里给出我搜索相关的条目

    ss17.png
    而且我还很认真地核对我和这些文章里面提到的配置(对比过两次),也和我之前做在Mac和Ubuntu中所作的配置进行对比。

    一到测试的时候,就出现如下图错误,这里我要引出一个问题是什么呢?写类似这些文章的时候,我要口诛笔伐地拷问他们是否真的核对过自己所作的设置是否能够正常运行,然后再Post上网的呢!还是有意写文的时候挖了个坑等后面遇到同样问题的同行再踩下去,若是这样,是非常不厚道的行为。

    最终这个坑确实是要你自己去发现和解决的,说实话我之前一直在Linux环境下用VScode用的很省心的,到了Windows改用MSYS2你非的折腾一番才行。你若有心写文的话就请确保正确的配置自己确实可以正常运行后才Post上网,若无心有意就误导他人。

    至于这个坑是什么呢?其实就是MSYS2的路径解析机制

    > Executing task: /mingw64/bin/clang++ f:\cool\main.cpp
      -o f:\cool/app/main.exe -g -std=c++17 <
    
    clang++: error: no such file or directory: 'f:coolmain.cpp'
    clang++: error: no input files
    终端进程已终止,退出代码: 1
    

    从上图的错误输出,就可以看出
    “f:\cool\main.cpp”以及“f:\cool/app/main.exe”这两个文件路径分别是从VScode的tasks.json中的两个预设变量${file}和“${fileDirname}/app/${fileBasenameNoExtension}.exe”解析而来。这是Windows风格的文件路径。

    但Windows风格的文件路径,若没有映射为Unix风格的文件路径,直接传递给MSYS2环境下的bash类似的shell执行的话,就出问题了。上面当VSCode解析的Windows风格路径传递给MSYS2的bash终端时,MSYS2会将后斜杠“\”直接省略掉。那么就会解析成“f:coolmain.cpp”,所以bash就认为这样的路径表示的文件是不存在的错误提示。那么最终你就无法成功执行这条指令的编译了。这也是我要写本文的原因。

    写本文是记录下这次教训,查找网上任何中文资料,我劝告各位读者要带着批判性的思维会参考他人写的心得随笔,遇到问题要找到对应问题的根源。这样你自己遇到同样的问题后将自己心得以文字的形式记录下来才会成为你知识链中的宝贵财富之一。至于本文提到的这个坑嘛,请继续往下看。

    当你们使用VSCode+MSYS2作为你开发环境的时候,要留个心眼,因为MS已经对VSCode内置预设的变量解析为真正的文件变量时做出了修正

    在Windows上所有预设内置变量以平台格式返回,例如${relativeFile}或${workspaceFolder}之类的路径变量。

    • 在Windows版本中会使用反斜杠“\”而不是前斜杠“/”,这正正与你MSYS2的文件路径解析约定相抵触的,如果任何基于MSYS2环境写的所有中间件引用到反斜杆都会在MSYS2中执行失败。
    • 所有类Unix的系统家族中不受影响,因为对于所有类Unix平台,VSCode的内置预设变量自动将文件路径自动包含前斜杠“/”
      此图发言中应该VSCode的内部开发者给用户的反馈

    反正VSCode用户的建议不会采纳的意思,我这里罗列了一些外国的VSCode用户已经向MS官方这个一意孤行的改动希望撤回的有关截图,但人家“巨硬”并不买VSCode用户的账,一路走到黑。类似的态度:你爱用就用,不用就滚的嘴脸,而且可以VSCode的内置预设变变量解析机制更改也没有做版本更新信息中做过具体说说明。
    以下是一些老外的反馈截图


    ss18.png
    具体链接
    https://github.com/microsoft/vscode/issues/70050

    总结:

    说到这里,算了!如果你的开发工作对平台环境没有过多硬性要求的话,我建议你老老实实Linux+VSCode是不错的选择,若你选择VSCode+Windows+MSYS2会浪费你的宝贵时间,因为其VSCode预设的内置变量与MSYS2是不相容的,你非得要用其实也可以,只要你在json配置文件避免使用内置预设变量,而是用具体的路径,这样做一旦你项目存储的硬盘分区的盘符变更了,并且可能有零零散散许多项目的话,可以啊,慢慢手动去改吧,转牛角尖是需要付出代价的。

    其实微软这么做,无非就是想Windows下的VSCode的用户将注意力转向商用版本的Visual Studio,这是人家的产品当然有权这么做。但码农也可选择不使用它的自由。说完,睡觉去~~~!!

    相关文章

      网友评论

        本文标题:批判性地看待网上的VScode+MSYS2

        本文链接:https://www.haomeiwen.com/subject/seofgctx.html