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的指定的一些总结
/utf-8 (Set source and execution character sets to UTF-8)
Visual Studio C++ 默认 UTF-8 编码及 *.editorconfig 统一代码格式 - Me伟 - 博客园 (cnblogs.com)
文章来源: 博客园
- 还没有人评论,欢迎说说您的想法!