加载中...
集成MSys2终端与三方库安装示例
第1节:MSYS2+GCC 安装与应用
第2节:安装配置 VSCODE,理解「配置」和「设置」的区别
第3节:C/C++简捷项目专用配置
第4节:让C/C++简捷项目支持多文件编译
第5节:备战大项目:CMake专项配置
第6节:集成 AI 助手——MarsCode
第7节:集成MSys2终端与三方库安装示例
第8节:安装 Git for Windows
第9节:Go 开发环境搭建(Windows)
课文封面

在VSCode中集成 MSys2 终端,能让我们的开发过程更顺畅。作为示例,本课以utf8-cpp 为例,演示了在VSCode中一体化安装、使用第三方库的丝滑过程。

注:utf8-cpp是一个历史悠久的 C++ 字符串编码转换库,主要用于unicode字符集下多种编码的互相转换。

0. 为什么要在 vscode 里集成 msys2 终端?

在vscode 中集成 msys2 终端,并非开发的必要步骤。

想要安装第三方库,完全可以在 msys2 自己提供的那个终端程序中,或者前面课程中我们集成在 Windows 终端下集成的 msys2 环境里安装。

不过,想像一下,你在 vscode 里写着代码,发现需要安装一个第三方库——并且这个库正好在 msys2 的仓库中,于是你按下热键 Ctrl + Shift + ` ,打开 vscode 的终端,再打开集成的 msys2,通过 pacman -S 库名,安装好所需库。切回源代码,开始在项目中使用中这个库……

是不是感觉这个过程很丝滑?

1. utf8-cpp 是什么?

网址:github.com/nemtrif/utfcpp

因为是 github,所以可能一时打不开,可换个时间段多尝试几次。

我们很快会推出专讲 utf8-cpp 库的独立课程。这里仅作简单介绍。

C/C++ 编程,所使用的字符串主力编码是 utf8(包括源代码文件自身的编码),但是,不少其他编程语言它们的主力编码是 UCS32 或 UCS16。因此,当 C++ 写的程序需要和别的语言写的程序交换数据(可能通过网络通信,也可能是读取对方生成的数据文件等手段),收到的数据可能是 UCS32 或 UCS16 等其他编码,此时 C++ 程序为了方便处理这些数据,第一步要做的,就是将它们转换成 utf8 编码。

反过来,如果需要将数据发送给别的程序,C++程序有可能需要将 utf8 编码的字符串,转换成 UCS32 或 UCS16等其他编码。

以上转换过程,可以使用 utf80cpp 这个库。这是一个纯头文件的库,因此使用起来很方便,并且支持多个平台(Windows、Linux 等)。

2. 视频

请先看视频,再看本课堂视频后的文字章节。

3. 关键配置内容

一、在 vscode 中切换到需集成 msys2 的开发专用配置。本课程之前准备的 CS-Cpp-Simple 或 CM-Cpp-CMake 建议都集成。其中,CMake 的项目使用第三方库的可能性更高。

二、Ctrl+, 进入设置,确保选中 “用户” 级别设置。在设置过滤栏中,输入以下关键词:Terminal Integrated Profiles Windows,再点击该设置项的内的 在 settings.json中编辑 链接,将打开该设置文件以直接编辑。

三、在 “terminal.integrated.profiles.windows” 项内最后,添加以下内容:

, "MSYS2-UCRT64": { "path": "C:\\msys64\\msys2_shell.cmd", "args":[ "-defterm", "-here", "-no-start", "-ucrt64" ], "icon": "terminal-bash", "overrideName": true }

注意:

  1. 其中的 “path” 字段的路径,替换成你的msys2实际安装的路径,且注意添加转义符;
  2. icon 只能是vscode 内置图标的名称 (输入时,vscode 会自动给出列表);
  3. “overrideName” 项在视频中没有讲,作用是确保使用 “MSYS2-UCRT64” 作为终端名字,包括打开该终端后显示的内容(否则会显示终端的实际进程名字 “bash”);
  4. “-ucrt64” 和你当初安装 msys2 的选择有关,详见本课程第一课

4. utf8-cpp 安装

以 64 位,ucrt 环境为例,utf8cpp 的包名字为 mingw-w64-ucrt-x86_64-utf8cpp。可以在集成的 msys2 终端内,通过执行以下指令搜索及安装该开发库。

1 .搜索(可选步骤)

pacman -Ss mingw-w64-ucrt-x86_64-utf8cpp
  1. 安装(如搜索后发现未安装)
pacman -S mingw-w64-ucrt-x86_64-utf8cpp

5. utf8-cpp 使用示例

#include <iostream> #include <string> #include <utf8cpp/utf8.h> int main() { std::wstring wstr = L"我是 UNICODE 字符集下的宽字符"; // Windows 下宽字符串 // 目标: 将 wstring -> string (utf-8 编码) // 第1步:先转为固定的 32 位编码: std::u32string u32str { wstr.cbegin(), wstr.cend() }; // 第2步:再转为 utf-8 编码: std::string utf8str = utf8::utf32to8(u32str); // 输出结果: std::cout << utf8str << std::endl; }
  • 关键解释
  1. std::u32string 是 C++11 引入的字符串类型,用于存储、表达每个字符固定为 32 位(四字节)的字符串;
  2. std::wstring 宽字符串,可用 L"字符串内容" 的字面值初始化。该类型的最大问题是平台相关(Windows 下2字节,Linux 等平台下 4 字节);
  3. std::wstring 可直接转换成 std::u32string,如代码中“第1步”所示;
  4. utf8::utf32to8()函数可将 std::u32string 转换成 std::string(以 utf-8编码),如代码中“第2步”所示。