1
0
Fork 0
blog/content/posts/图灵机/瞎折腾MinGW.md

172 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: 瞎折腾MinGW
date: 2024-02-02
slug: how-to-update-mingw
summary: 乱七八糟瞎折腾
description: 这篇文章介绍了作者在更新 MinGW 过程中遇到的各种问题和解决方法。作者首先回顾了自己在学习递归和调试时的困难经历,强调了命令行调试的复杂性。随后,作者分享了自己发现并尝试更新 MinGW 的过程,包括从 GitHub 下载最新版本并替换旧版本的步骤。接着,作者详细描述了如何在 VS Code 中配置可视化调试环境,通过编写和修改配置文件(如 `c_cpp_properties.json``launch.json``tasks.json`)来实现调试功能。尽管成功配置了可视化调试,作者表示自己仍然更习惯使用命令行调试。文章最后感谢了一位学长的教程,并表达了对折腾过程的感慨。
tags:
- C++
- 教程
categories: ["图灵机"]
---
嗨,大家好,我是 Chlorine.
本期的主要内容是讲述我更新 MinGW 的痛苦经历,寄术力不高,大佬轻喷。引用一句[某乎上的话](https://zhuanlan.zhihu.com/p/137332644):
> 知识就是这样的,也许一个问题在老鸟看来是一颗土坷垃,但对于初学者却是一座大山。
## 历史遗留问题
当年我们在学递归之后,老师布置了一个上机作业,要求原文如下:
> 以汉诺塔源程序为对象,参照 PPT 上关于阶乘示例的递归调用与返回过程的示意图,在集成开发环境中,以单步跟踪方式,打开汇编代码和机器代码显示功能,观察函数调用栈(内存)的变化情况,观察程序执行时“当前待执行机器指令”随着单步执行的变化情况。在发生递归调用时,记录函数实参和形参的地址与内容,记录函数调用结束后的返回点指令地址。
这其实是个简单得离谱的任务,更不用提写上机报告一向是我引以为豪的能力(期末成绩,上机报告部分 99.9 分,扣掉的 0.1 是因为第一篇是用 Obsidian 写的,导出的时候标题没居中)。
可是问题是:**我不会单步跟踪调试**。(上课摆烂的后果 qaq
跟着助教的讲解视频,查网上的教程,甚至是安了好几个其他的 IDE都是完不成我好像就和调试有仇。
最后幸好一位好心的 TA 学长教了我一些命令行调试,才让我把报告写出来(最后成绩是满分 q(≧▽≦q))。
所以以后我在做单步跟踪调试的时候,一直都是在用命令行。不是说命令行不好,但是的确有点复杂。此外,我在写 C++ 教程的时候,总不能上来就往人家脸上糊命令行吧().
## 补偿性折腾
最近我发现了一个很好玩的 Github 项目: [Bill-Haku/kawaii-gcc: GCCコンパイラーを可愛くしましょうMake your GCC compiler kawaii. (github.com)](https://github.com/Bill-Haku/kawaii-gcc)
这里是 B 站解说视频地址: [【中文】杂~鱼♡!人家 GCC 也想变得可爱嘛~】](https://www.bilibili.com/video/BV1gC4y1P7t3?vd_source=b7e941d0715a442723fb5ad229adf1cb)
说实话,我看完之后,真的感觉:好可爱!
然后我忧伤地得知目前只支持 Cygwin。
但是,我折腾的兴奋度已经被挑起来了。不折腾点什么,我是不会罢休的。
## MinGW 的更新
综合以上两段原因,我决定折腾下我的 VS Code + MinGW-w64。
终端里扔个 `gcc -v`, 发现我的 gcc 居然才 8.1.0,于是我决定更新。
MinGW 没有什么一键更新的命令,同时官网上一大堆离奇的布局看得我五彩缤纷。
于是我找到了 [MinGW-64 的 Github 二进制仓](https://github.com/niXman/mingw-builds-binaries)。直接把 release 的最新版本下载下来,解压完事。
*PS: 我下载的是 `x86_64-13.2.0-release-posix-seh-ucrt-rt_v11-rev0.7z`*
解压的时候我图省事,解压到了默认的 download 文件夹,本来想着一会给移到我原本的 D 盘去,结果遇见了这样的擀人速度:
(图片丢了,乐)
好吧,不管怎么样,总算是挪过去了。由于我解压之后的文件夹也叫 `mingw`,因此直接替换了原本的老版本文件,省去了再配一遍环境变量的麻烦。
然后随便开个终端,键入版本检查指令 `gcc -v`, `g++ -v``gdb -version`,发现更新成功了。
## 可视化调试的配置
其实这也不是什么难事,也就是几个文件的事,但是 VS Code 这厮总是给我闹幺蛾子,于是干脆自己动手写(抄)文件.
把原本 C++ 文件夹的 `.vscode` 子文件夹删空,新建三个文件,把当时留下的代码扔进去:
```json
// c_cpp_properties.json
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"compilerPath": "D:\\\\mingw64\\\\bin\\\\gcc.exe",
"intelliSenseMode": "windows-gcc-x64",
"cppStandard": "c++23",
"cStandard": "c23"
}
],
"version": 4
}
```
```json
// launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "g++.exe - Build and debug active file",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "D:\\\\mingw64\\\\bin\\\\gdb.exe",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++.exe 生成活动文件"
}
]
}
```
```json
// tasks.json
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++.exe 生成活动文件",
"command": "D:\\\\mingw64\\\\bin\\\\g++.exe",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}\\\\${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}
```
重启 VS Code随便写个 C++ 文件,在左侧工具栏尝试可视化调试,完美。
(图片又丢了,乐)
## 后记
就折腾到这吧。尽管说有了可视化调试的方法,但是我可能还是习惯于用命令行。这次折腾大概还是为了解决强迫症的历史遗留问题。
毕竟我还是无法拥有可爱的 GCC qaq
感谢这位学长的教程[用vscode优雅配置c/c++环境!](https://zhuanlan.zhihu.com/p/610895870)。