vscode c/c++ MinGW/MSYS2 配置 | 解决中文乱码/找不到dll问题(不设置环境变量)

本文主要是在不设置环境变量的情况下配置vscode并解决常见问题

MinGW/MSYS2 安装

MSYS2 是一个类似于Linux的shell环境,可以在Windows上使用pacman安装软件包。它包含了一个mingw-w64工具链,可以在Windows上编译出可执行文件。
MinGW-w64 - for 32 and 64 bit Windows
选择MinGW-W64 GCC-8.1.0 或以上版本,x86_64-posix-seh

[科普][FAQ]MinGW vs MinGW-W64及其它

c/c++ vscode环境搭建

c/c++ vscode环境搭建参考这篇知乎文章: 给萌新的C/C++环境搭建攻略(VSCode和MSYS2)

msys2 配置

msys2安装完成后,开始菜单会有多个启动方式:

MSYS2 MSYS
MSYS2 MinGW 64bit
MSYS2 MINGW 32bit
MSYS2 UCRT64
MSYS2 Clang64
MSYS2 ClangARM64

推荐使用 MSYS2 UCRT64(Universal C Runtime) 。简单来说就是在msys(紫色图标) 使用pacman 指定安装ucrt的软件。比如mingw工具链 pacman -S mingw-w64-ucrt-toolchain,这里的软件包会被安装到 msys64ucrt64 目录下。所以使用时要用UCRT64(黄色图标) 启动。

msys2 中 mingw64 ucrt64 clang64 的区别

最新版官方已经配置好了镜像源,不用担心下载速度的问题。

可以参考
windows上msys2配置及填坑
msys2 环境配置记录 - wswind - 博客园
使用msys2打造优雅的开发环境

vscode 配置文件

文章中没有提到vscode的配置文件的编写,这里补充一下。

在 vsocde 运行 c/c++ 代码,需要配置 launch.json 和 tasks.json 两个文件。
这两个文件在当前文件夹内的.vscode 文件夹下。 这里给出我的配置文件,修改一下路径就可以使用了。
这里使用绝对路径的写法,不依赖环境变量。(不推荐使用环境变量,到后面会有坑)

launch.json

{
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "g++.exe Debug", // 配置名称,将会在启动配置的下拉菜单中显示
            "type": "cppdbg", // 配置类型,cppdbg对应cpptools提供的调试功能;可以认为此处只能是cppdbg
            "request": "launch", // 请求配置类型,可以为launch(启动)或attach(附加)
            "program": "${fileDirname}\${fileBasenameNoExtension}.exe", // 将要进行调试的程序的路径
            "args": [], // 程序调试时传递给程序的命令行参数,一般设为空即可
            "stopAtEntry": false, // 设为true时程序将暂停在程序入口处,相当于在main上打断点
            "cwd": "${workspaceFolder}", // 目标的工作目录
            "environment": [
                {
                    "name": "PATH",
                    "value": "C:/programs/msys2/ucrt64/bin;${env:PATH}" // 环境变量,将会在程序运行前进行设置
                }
            ], // 环境变量,将会在程序运行前进行设置
            "externalConsole": false, // 如果为 true,则为调试对象启动控制台即会有小黑框。如果为 false,它在 Linux 和 Windows 上会显示在集成控制台中。
            "MIMode": "gdb", // 指示 MIDebugEngine 要连接到的控制台调试程序。允许的值为 "gdb"、"lldb"。
            "miDebuggerPath": "C:/programs/msys2/ucrt64/bin/gdb.exe", // MI 调试程序(如 gdb)的路径。如果未指定,将首先在路径中搜索调试程序。
            "setupCommands": [
                { // 模板自带,可以更好地显示STL容器的内容
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "g++.exe Debug" // 调试会话开始前执行的任务,一般为编译程序.g++.exe build active file与tasks中的同名任务对应,即在调试前会执行tasks中的这个任务
        },
        {
            "name": "g++.exe Release", // 配置名称,将会在启动配置的下拉菜单中显示
            "type": "cppdbg", // 配置类型,cppdbg对应cpptools提供的调试功能;可以认为此处只能是cppdbg
            "request": "launch", // 请求配置类型,可以为launch(启动)或attach(附加)
            "program": "${fileDirname}\${fileBasenameNoExtension}.exe", // 将要进行调试的程序的路径
            "args": [], // 程序调试时传递给程序的命令行参数,一般设为空即可
            "stopAtEntry": false, // 设为true时程序将暂停在程序入口处,相当于在main上打断点
            "cwd": "${workspaceFolder}", // 目标的工作目录
            "environment": [
                {
                    "name": "PATH",
                    "value": "C:/programs/msys2/ucrt64/bin;${env:PATH}" // 环境变量,将会在程序运行前进行设置
                }
            ], // 环境变量,将会在程序运行前进行设置
            "externalConsole": false, // 如果为 true,则为调试对象启动控制台即会有小黑框。如果为 false,它在 Linux 和 Windows 上会显示在集成控制台中。
            "MIMode": "gdb", // 指示 MIDebugEngine 要连接到的控制台调试程序。允许的值为 "gdb"、"lldb"。
            "miDebuggerPath": "C:/programs/msys2/ucrt64/bin/gdb.exe", // MI 调试程序(如 gdb)的路径。如果未指定,将首先在路径中搜索调试程序。
            "setupCommands": [
                { // 模板自带,可以更好地显示STL容器的内容
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "g++.exe Release" // 调试会话开始前执行的任务,一般为编译程序.g++.exe build active file与tasks中的同名任务对应,即在调试前会执行tasks中的这个任务
        },
    ]
}

tasks.json

{
    // 有关 tasks.json 格式的文档,请参见
    // https://go.microsoft.com/fwlink/?LinkId=733558
    "tasks": [
        {
            "type": "shell",
            "label": "g++.exe Debug", // 任务名称,与launch.json中对应,使用g++编译cpp文件,并在同目录下生成可执行文件
            "command": "g++",
            "args": [
                "-fdiagnostics-color=always",
                "-g", // 生成和调试有关的信息
                //
                // "-fexec-charset=GBK", // 处理mingw中文编码问题
                // "-finput-charset=UTF-8", // 处理mingw中文编码问题
                //
                "-Wall", // 显示所有的警告信息
                "${file}",
                "-o", // 指定输出文件名,不加该参数则默认输出a.exe,Linux下默认a.out
                "${fileDirname}\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "${fileDirname}", // 指定任务的工作目录
                "env": {
                    "PATH": "C:/programs/msys2/ucrt64/bin;${env:PATH}" // 环境变量,将会在程序运行前进行设置
                },
            },
            "problemMatcher": [
                "$gcc"
            ],
            // 所以以上部分,就是在shell中执行 g++ -g -Wall -fexec-charset=GBK -finput-charset=UTF-8 ".cpp" -o ".exe"
            // 任务分组
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "调试器生成的任务。"
        },
        {
            "type": "shell",
            "label": "g++.exe Release", // 任务名称,与launch.json中对应,使用g++编译cpp文件,并在同目录下生成可执行文件
            "command": "g++",
            "args": [
                "-fdiagnostics-color=always",
                "-O3", // 优化等级3
                "-static", // 静态链接
                "-lpthread", // 链接pthread库
                //
                // "-fexec-charset=GBK", // 处理mingw中文编码问题
                // "-finput-charset=UTF-8", // 处理mingw中文编码问题
                //

                "${file}",
                "-o", // 指定输出文件名,不加该参数则默认输出a.exe,Linux下默认a.out
                "${fileDirname}\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "${fileDirname}", // 指定任务的工作目录
                "env": {
                    "PATH": "C:/programs/msys2/ucrt64/bin;${env:PATH}" // 环境变量,将会在程序运行前进行设置
                },
            },
            "problemMatcher": [
                "$gcc"
            ],
            // 所以以上部分,就是在shell中执行 g++ -g -Wall -fexec-charset=GBK -finput-charset=UTF-8 ".cpp" -o ".exe"
            // 任务分组
            "group": {
                "kind": "build",
            },
            "detail": "Release版本生成的任务。"
        },
    ],
    "version": "2.0.0"
}

mingw中文编码问题

最新版vscode会自动识别改变终端编码为utf-8,如果运行结果没有乱码,那么可以不用管这个问题。

乱码的主要原因是vscode默认使用的是utf-8编码,而 windows默认使用的是gbk编码。所以需要在vscode中配置一下。

整个过程是这样的:

我们代码的编码是UTF-8
把UTF-8编码的代码交给mingw,它也默认当做UTF-8处理(目前为止这是正确的)
mingw处理后生成的数据还是UTF-8编码(目前为止还是正确的)
把mingw处理后的数据(UTF-8编码)给cmd(目前为止也是正确的)
cmd按GBK编码处理它(UTF-8),这时出现错误,所以出现乱码

因此有两种解决方案,一个是将vscode的编码改为gbk,一个是将命令行的编码改为utf-8。

输出编码改为gbk

编译时使用GBK编码输出,然后再让命令行去显示。已经在配置文件中设置好选项,取消注释即可。

命令行编码改为utf-8

在新版中设置添加了选项Terminal › Integrated: Detect Locale,默认auto已经可以解决问题,但是如果不行,可以手动设置。

在 settings.json 中添加以下内容,手动设定终端编码:

  "terminal.integrated.defaultProfile.windows": "PowerShell",//默认终端,可选项为PowerShell,Command Prompt
    "terminal.integrated.profiles.windows": {
      "PowerShell": {
        "source": "PowerShell",
        "args": ["-NoExit", "/C", "chcp 65001"],
        "icon": "terminal-powershell"
      },
      "Command Prompt": {
        "path": [
          "${env:windir}\Sysnative\cmd.exe",
        "${env:windir}\System32\cmd.exe"
        ],
        "args": [
          "/K",
          "chcp 65001"
        ],
        "icon": "terminal-cmd"
      },

  },

或者修改终端的编码

powershell7:

在profile.ps1中添加以下内容

$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding

cmd :

通过注册表修改编码:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USERConsole%SystemRoot%_system32_cmd.exe]
"FontSize"=dword:00140008
"CodePage"=dword:000003a8

不使用环境变量使用code runner

目前的解决方案是在powershell的配置文件中添加以下内容:

$Env:Path += ";C:/programs/msys2/ucrt64/bin "#添加mingw的路径

使用MinGW-w64编译的文件打开失败

解决方案:将dll文件复制到可执行文件所在的目录或使用静态编译(运行时选择Release)。

CMake 编译

VScode+MSVC+CMake搭建C++开发环境
Windows下VSCode+CMake搭建开发环境

参考链接

关于UTF-8、GBK编码以及编译时charset的指定的一些总结

愿编程不再乱码(含Qt)-根因深究

mingw控制台中文乱码

Make console windows fully UTF-8 by default on Windows, in line with the behavior on Unix-like platforms

/utf-8 (Set source and execution character sets to UTF-8)

在Visual C++中使用UTF-8格式代码文件

Visual Studio C++ 默认 UTF-8 编码及 *.editorconfig 统一代码格式 - Me伟 - 博客园 (cnblogs.com)

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/xxxfhy/p/17480682.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!

相关课程