将 MSYS 添加到 Windows 终端

RAT*_*RAT 7 msys windows-terminal

我通过编辑 settings.json 文件将 Windows 上的 bash 添加到 Windows 终端,当我尝试编译用 c++ 编写的简单 hello world 时,它会抛出错误,未检测到 gcc 或 g++ 如何正确添加 MSYS bash 终端,以便我可以从 Windows 终端编译文件

在 settings.json 中,我添加了 bash shell 的路径,如下所示:

{
  "commandline": "powershell.exe",
  "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
  "hidden": false,
  "name": "Windows PowerShell"
},
{
  "guid": "{b453ae62-4e3d-5e58-b989-0a998ec441b8}",
  "hidden": false,
  "name": "Azure Cloud Shell",
  "source": "Windows.Terminal.Azure"
},
{
  "commandline": "C:\\msys64\\usr\\bin\\bash.exe -i -l",
  "guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}",
  "hidden": false,
  "name": "msys2"
},
{
  "guid": "{495d29da-4bfb-4956-abd8-ed1760703232}",
  "commandline": "cmd.exe",
  "hidden": false,
  "name": "cmd.exe"
}
Run Code Online (Sandbox Code Playgroud)

Wee*_*kie 10

我建议检查文档但这是我自己的 MSYS 编辑

{
    "commandline": "C:\\msys64\\msys2_shell.cmd -defterm -here -no-start -mingw64 -shell bash",
    "guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}",
    "hidden": false,
    "name": "msys2"
}
Run Code Online (Sandbox Code Playgroud)

在powershell中使用New-Guid创建新的guid


Gab*_*les 10

从头开始安装和设置 MSYS2,包括将所有 7 个配置文件添加到 Windows 终端

于 2023 年 10 月 31 日在 Windows 11 上的最新版本 MSYS2(msys2-x86_64-20231026.exe来自https://www.msys2.org/)上进行了测试,作为一种令人毛骨悚然的享受。

作为@Weed Cookie 答案的更适合初学者的、彻底的和定制的版本,以下是我和其他初学者肯定需要的其他详细信息。

请注意,MSYS2 包括MinGW-w64和 Pacman 包管理器,是一个强大的、类似 Linux 的终端以及适用于 Windows 的 GCC 和 LLVM (clang) 构建环境。它类似于 Cygwin,Git for Windows中的 Git Bash使用 MSYS2 mingw64 环境。然而,MSYS2 针对构建软件进行了优化,因此对于使用 Git ,他们建议您还单独安装和使用适用于 Windows 的 Git Bash 的 Git。因此,您可以将常规 MSYS2 视为本机 Windows 构建环境,而将 Git Bash 视为git基于 MSYS2 的本机 Windows 和开发人员环境。

MSYS2 有点像在 Windows 中运行的 Linux 的轻型版本。与 WSL(Windows Subsystem for Linux)(即 Windows 上的 Linux)相比 MSYS2 有一个巨大的警告:来自https://www.msys2.org/docs/what-is-msys2/(强调已添加):

MSYS2 允许您构建本机 Windows 程序,而使用 WSL 您只能交叉编译它们,这使事情变得更加复杂。

所以:

  1. git通过 Git Bash,您可以在本机 Windows 中运行命令。
  2. 从 MSYS2 UCRT64(或类似)终端,您可以在本机 Windows 中运行 gcc 构建命令。例如:像这样来自我的eRCaGuy_hello_world存储库:https://github.com/ElectricRCAircraftGuy/eRCaGuy_hello_world/blob/master/c/hello_world_extra_basic.c#L24
    gcc -Wall -Wextra -Werror -O3 -std=gnu17 hello_world_extra_basic.c -o bin/a -lm && bin/a
    
    Run Code Online (Sandbox Code Playgroud)
  3. 通过 WSL(适用于 Linux 的 Windows 子系统),您可以在 Windows 中拥有真正的 Linux 环境。前两个是Windows 中类似Linux 的环境。WSL 是真正的 Windows 中的 Linux。

添加到 Windows 终端的所有 7 个MSYS2 配置文件的说明

以下是 7 种 MSYS2 shell/环境类型:

  1. msysmsys2(现在同样的事情)- 基本 MSYS2 工具;下面的所有其他环境都继承自这个环境;包含 GCC 64 位编译器和 Cygwin C 库
  2. mingw32- 适用于 Windows 32 位的极简 GNU;包含 GCC 32 位编译器
  3. mingw64-适用于 Windows 64 位的极简 GNU;包含 GCC 64 位编译器
  4. ucrt64- UCRT(通用 C 运行时) 64 位;包含 GCC 64 位编译器;MSYS2:“如果您不确定,请选择 UCRT64 [这个]。” 也看看这个评论。默认情况下仅适用于 Windows 10 或更高版本。
  5. clang64- 包含LLVM/Clang 64 位编译器
  6. clang32- 包含 LLVM/Clang 32 位编译器
  7. clangarm64- 包含 LLVM/Clang 64 位 ARM ( AArch64 ) 编译器

来自: https: //www.msys2.org/docs/environments/

在此输入图像描述

同样来自https://www.msys2.org/docs/environments/(添加了重点):

MSYS2 具有不同的环境,您必须决定的第一件事是使用哪个。环境之间的差异主要是环境变量、默认编译器/链接器、体系结构、使用的系统库等。如果您不确定,请使用UCRT64

MSYS环境...始终处于活动状态。所有其他环境都继承自MSYS环境,并在其之上添加各种内容。

例如,在UCRT64环境中$PATH,变量以 开头,/ucrt64/bin:/usr/bin因此您可以获得所有基于 ucrt64 的工具以及所有 msys 工具。

活动环境是通过MSYSTEM环境变量选择的。设置MSYSTEMUCRT64启动登录 shell 会将您置于该环境中。

有关GCC 与 LLVM/Clang以及MSVCRT 与 UCRT的详细信息,请参阅此处: https: //www.msys2.org/docs/environments/

UCRT(通用 C 运行时)是一个较新的版本,Microsoft Visual Studio 也默认使用它。它的工作和行为应该就像代码是用 MSVC 编译的一样。

  • 默认情况下,它仅在 Windows 10 [或更高版本] 上提供

主要参考资料:

  1. https://www.msys2.org/docs/what-is-msys2/

    MSYS2 与 WSL

    MSYS2 允许您构建本机 Windows 程序,而使用 WSL 您只能交叉编译它们,这使事情变得更加复杂。

  2. https://www.msys2.org/docs/environments/ - 非常有用!

  3. https://www.msys2.org/docs/who-is-using-msys2/

    Git for Windows基于 MSYS2

设置所有 7 个 MSYS2 shell/环境以在 Windows 终端中运行

  1. 下载并安装最新版本的MSYS2。

    1. 您可以在这里获取它: https: //www.msys2.org/
  2. 确保已安装 Windows 终端。如果您使用的是 Windows 11 或更高版本,则它已安装。如果您使用的是 Windows 10 或更早版本,则需要从 Microsoft Store 手动安装 Windows 终端,此处:https: //apps.microsoft.com/detail/9N0DX20HK701 ?hl=en-zm&gl=ZM

  3. 打开 Windows PowerShell 并运行New-Guid 7 次,针对我们将在下面创建的每个 MSYS2 配置文件条目运行一次。将数字复制并粘贴到文本编辑器中。稍后您将需要这些号码。示例:这是我生成的 GUID 号:

    6f0ee3d1-ac4f-48ca-bcf5-a9795f9942d2
    80414396-5ef4-490b-af88-29600c19ca4a
    aef16ae0-7dd1-4ac7-abd8-60a646abb9ca
    a718a3d5-9e77-4d0d-b7b6-69ec3d190206
    1f2869c0-1310-403b-93a7-9227f42eeb24
    10c96d8f-9e6b-48f6-8f59-034c586d7e57
    ada1f939-0f7b-400c-b755-8cbff4fd40a8
    
    Run Code Online (Sandbox Code Playgroud)
  4. 打开 Windows 终端,然后添加 7 个新的 MSYS2 配置文件条目:

    打开 Windows 终端。

    然后,单击打开的选项卡右上角的小下拉箭头,然后选择“设置”-->在打开的“设置”选项卡中,单击左下角的“打开 JSON 文件”,如下所示:

    在此输入图像描述

    在打开的 JSON 设置文件中,查找"profiles"JSON 文件中的以下部分:

    6f0ee3d1-ac4f-48ca-bcf5-a9795f9942d2
    80414396-5ef4-490b-af88-29600c19ca4a
    aef16ae0-7dd1-4ac7-abd8-60a646abb9ca
    a718a3d5-9e77-4d0d-b7b6-69ec3d190206
    1f2869c0-1310-403b-93a7-9227f42eeb24
    10c96d8f-9e6b-48f6-8f59-034c586d7e57
    ada1f939-0f7b-400c-b755-8cbff4fd40a8
    
    Run Code Online (Sandbox Code Playgroud)

    在这里,我们将添加7 个新的 MSYS2 配置文件。为每个条目使用上面先前生成的列表中的唯一 GUID。请务必在上面最后一个预先存在的配置文件条目的末尾添加逗号。

    以下是上面 JSON"profiles"列表中我的新条目。根据您上面生成的内容,您的 GUID 应该有所不同(实际上我不知道您的 GUID 是否需要与我的不同;我只知道每个条目都需要一个唯一的 GUID)。确保在每个条目后面添加一个逗号,包括在}上面最后一个条目末尾添加一个逗号。请注意路径中类似 Linux 的正斜杠。

    我的 7 个新 MSYS2 配置文件:

    "profiles":
    {
        "defaults": {},
        "list":
        [
            // ...
            {
                "guid": "{b453ae62-4e3d-5e58-b989-0a998ec441b8}",
                "hidden": false,
                "name": "Azure Cloud Shell",
                "source": "Windows.Terminal.Azure"
            },  // <=== add this comma here!
    
            // new profile entries go here! <=====
        ]
    },
    
    Run Code Online (Sandbox Code Playgroud)

    将上面的 7 个新配置文件复制并粘贴到 Windows 终端 JSON 设置文件中的正确位置。

    保存 JSON 文件并将其关闭。

  5. 如何更改默认 shell:

    请注意,如果您想使用其他 shell,例如fishzsh,您可以在上面的配置文件命令中使用-shell fish-shell zsh来代替。-shell bash请参阅此处: https: //www.msys2.org/docs/terminals/。如果您不确定,请坚持使用-shell bash

  6. 返回 Windows 终端,单击顶部选项卡右上角的小下拉箭头。您现在将看到刚刚添加的 7 个新 MSYS2 条目!:

    在此输入图像描述

  7. 单击每一项进行测试,并确保它们全部运行。

  8. 选择 MSYS2 环境作为默认 Windows 终端配置文件:

    单击顶部选项卡右侧的小下拉箭头,然后再次转到“设置”--> 选择左侧的“启动”选项卡。

    更改“默认配置文件”-->“MSYS2:ucrt64(推荐默认值)”。

    将“机器启动时启动”设置为“打开”。

    将“终端启动时”更改为“从上一个会话打开窗口”。

    单击“保存”。

    以下是我的 Windows 终端“启动”设置:

    在此输入图像描述

  9. HOME( ~) 目录从 MSYS2 的默认目录更改C:\msys64\home\my_username为常规 Windows 主目录C:\Users\my_username

    C:\msys64\home\my_username\.bash_profile在文本编辑器(例如 VSCode)中打开。修改它,使其看起来像这样。注意:您可以注释掉所有内容#并将其添加到顶部

    "profiles":
    {
        "defaults": {},
        "list":
        [
            // ============================
            // previous profiles above here
            // ============================
    
            // -msys and -msys2 (same thing now: both options run msys2)
            {
                "commandline": "C:/msys64/msys2_shell.cmd -defterm -here -no-start -msys2 -shell bash",
                "guid": "{6f0ee3d1-ac4f-48ca-bcf5-a9795f9942d2}",
                "hidden": false,
                "name": "MSYS2: msys2",
                // "startingDirectory": "C:/msys64/home/%USERNAME%", // alternative
                "startingDirectory": "%USERPROFILE%", // ie: C:\Users\my_username
                "icon": "C:/msys64/msys2.ico",
                "font": 
                {
                    "size": 10
                }
            },
    
            // -mingw32
            {
                "commandline": "C:/msys64/msys2_shell.cmd -defterm -here -no-start -mingw32 -shell bash",
                "guid": "{80414396-5ef4-490b-af88-29600c19ca4a}",
                "hidden": false,
                "name": "MSYS2: mingw32",
                // "startingDirectory": "C:/msys64/home/%USERNAME%", // alternative
                "startingDirectory": "%USERPROFILE%", // ie: C:\Users\my_username
                "icon": "C:/msys64/mingw32.ico",
                "font": 
                {
                    "size": 10
                }
            },
    
            // -mingw64
            {
                "commandline": "C:/msys64/msys2_shell.cmd -defterm -here -no-start -mingw64 -shell bash",
                "guid": "{aef16ae0-7dd1-4ac7-abd8-60a646abb9ca}",
                "hidden": false,
                "name": "MSYS2: mingw64",
                // "startingDirectory": "C:/msys64/home/%USERNAME%", // alternative
                "startingDirectory": "%USERPROFILE%", // ie: C:\Users\my_username
                "icon": "C:/msys64/mingw64.ico",
                "font": 
                {
                    "size": 10
                }
            },
    
            // -ucrt64 (recommended default)
            {
                "commandline": "C:/msys64/msys2_shell.cmd -defterm -here -no-start -ucrt64 -shell bash",
                "guid": "{a718a3d5-9e77-4d0d-b7b6-69ec3d190206}",
                "hidden": false,
                "name": "MSYS2: ucrt64 (recommended default)",
                // "startingDirectory": "C:/msys64/home/%USERNAME%", // alternative
                "startingDirectory": "%USERPROFILE%", // ie: C:\Users\my_username
                "icon": "C:/msys64/ucrt64.ico",
                "font": 
                {
                    "size": 10
                }
            },
    
            // -clang64
            {
                "commandline": "C:/msys64/msys2_shell.cmd -defterm -here -no-start -clang64 -shell bash",
                "guid": "{1f2869c0-1310-403b-93a7-9227f42eeb24}",
                "hidden": false,
                "name": "MSYS2: clang64",
                // "startingDirectory": "C:/msys64/home/%USERNAME%", // alternative
                "startingDirectory": "%USERPROFILE%", // ie: C:\Users\my_username
                "icon": "C:/msys64/clang64.ico",
                "font": 
                {
                    "size": 10
                }
            },
    
            // -clang32
            {
                "commandline": "C:/msys64/msys2_shell.cmd -defterm -here -no-start -clang32 -shell bash",
                "guid": "{10c96d8f-9e6b-48f6-8f59-034c586d7e57}",
                "hidden": false,
                "name": "MSYS2: clang32",
                // "startingDirectory": "C:/msys64/home/%USERNAME%", // alternative
                "startingDirectory": "%USERPROFILE%", // ie: C:\Users\my_username
                "icon": "C:/msys64/clang32.ico",
                "font": 
                {
                    "size": 10
                }
            },
    
            // -clangarm64
            {
                "commandline": "C:/msys64/msys2_shell.cmd -defterm -here -no-start -clangarm64 -shell bash",
                "guid": "{ada1f939-0f7b-400c-b755-8cbff4fd40a8}",
                "hidden": false,
                "name": "MSYS2: clangarm64",
                // "startingDirectory": "C:/msys64/home/%USERNAME%", // alternative
                "startingDirectory": "%USERPROFILE%", // ie: C:\Users\my_username
                "icon": "C:/msys64/clangarm64.ico",
                "font": 
                {
                    "size": 10
                }
            },
    
    Run Code Online (Sandbox Code Playgroud)

    关闭并重新打开 Windows 终端。运行echo ~echo "$HOME"并确保它们现在都显示/c/Users/my_username。运行ls -a并确保您看到用户的正常 Windows 主目录的内容。pwd应该显示您当前也位于该目录中,因为我们通过"startingDirectory": "%USERPROFILE%",上面的 JSON 文件进行了设置。

  10. 安装 Ubuntu 的默认文件~/.profile~/.bashrc文件:

    现在,创建一个C:\Users\my_username\.profile文件(如果您还没有),然后将这个默认 Ubuntu~/.profile文件的全部内容放入其中(来自我的存储库):https: //github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/etc/ skel/.profile

    如果您还没有 ~/.profile文件,最简单的方法是打开MSYS2: ucrt64终端并运行以下命令:

    # Change your home (`~`) dir to `C:\Users\my_username`
    HOME="/c/Users/$(whoami)"
    
    # Source your `C:\Users\my_username\.profile` file, if it exists
    if [ -f "$HOME/.profile" ]; then
        . "$HOME/.profile"
    fi
    
    Run Code Online (Sandbox Code Playgroud)

    现在,转到此处获取 Ubuntu 的默认~/.bashrc文件:https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/etc/skel/.bashrc。复制该文件的全部内容并将其粘贴到文件的顶部~/.bashrc

    # ================== END OF UBUNTU'S DEFAULT ~/.bashrc FILE ====================在文件末尾添加一个漂亮的标记~/.bashrc,然后在其下方添加所需的任何自定义条目。

  11. 重要提示:我们不想从Prompt String 1 变量中删除UCRT64和type 条目(它们出现在终端中键入的每一行之前),因为我们喜欢在提示符中看到这些重要标记,以提醒我们使用哪个 MSYS2 shell因此,进入您的文件并注释掉 Ubuntu 对变量所做的所有更改,如下所示:MINGW64PS1~/.bashrcPS1

    改变这个:

    cd ~
    
    # download Ubuntu's default ~/.profile file
    wget https://raw.githubusercontent.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/master/etc/skel/.profile
    
    # we might as well get the ~/.bash_logout file too
    wget https://raw.githubusercontent.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/master/etc/skel/.bash_logout
    
    Run Code Online (Sandbox Code Playgroud)

    ……对此。请注意,PS1=通过执行以下操作,所有更改都已被注释掉:

    if [ "$color_prompt" = yes ]; then
        PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
    else
        PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
    fi
    unset color_prompt force_color_prompt
    
    # If this is an xterm set the title to user@host:dir
    case "$TERM" in
    xterm*|rxvt*)
        PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
        ;;
    *)
        ;;
    esac
    
    Run Code Online (Sandbox Code Playgroud)
  12. 重要提示:我们不想意外覆盖任何真正重要的系统调用或构建命令,例如make.

    进入您的~/.bashrc文件~/.profile并搜索任何愚蠢的内容,例如覆盖make命令。我的~/.bashrc文件中有一些早期黑客的内容:

    # if [ "$color_prompt" = yes ]; then
    #     PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
    # else
    #     PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
    # fi
    unset color_prompt force_color_prompt
    
    # If this is an xterm set the title to user@host:dir
    case "$TERM" in
    xterm*|rxvt*)
        # PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
        ;;
    *)
        ;;
    esac
    
    Run Code Online (Sandbox Code Playgroud)

    不要那样做!当尝试在 MSYS2 终端中构建软件时,这可能会搞乱一切!删除或者注释掉这样的废话,像这样:

    alias make="'/c/Program Files/Microchip/MPLABX/v6.10/gnuBins/GnuWin32/bin/make.exe'"
    
    Run Code Online (Sandbox Code Playgroud)
  13. 现在,关闭并重新打开所有 Windows 终端窗口,在每个窗口中运行. ~/.profile以重新获取~/.profile文件的来源。

    如果您不知道“重新采购”是什么意思,请在此处阅读我的答案:( source) .vs (最后export还有一些文件锁 [flock ] 内容) 。

    运行alias以查看您的所有别名。查找您不需要的任何愚蠢的别名,并在必要时从您的文件~/.bashrc中删除或注释掉它们。~/.profile再一次,我有一个可笑的make别名(见上文)毁了一切!

    还要运行echo "$PATH"以查找 PATH 中不应该存在的任何愚蠢内容。如果您之前没有修改过 PATH,应该没问题。

  14. 测试你新的、漂亮的 Ubuntu 设置:运行ll,你会看到这个别名现在可以工作了!它是 的别名ls -alF,现在来自您的~/.bashrc文件。

  15. 更新MSYS2:

    # alias make="'/c/Program Files/Microchip/MPLABX/v6.10/gnuBins/GnuWin32/bin/make.exe'"
    
    Run Code Online (Sandbox Code Playgroud)

    y如果有要升级的软件包,请选择“是”( )。

    来源: https: //www.msys2.org/docs/updating/

  16. 将GCC安装到MSYS2 UCRT64环境中:

    time pacman -Suy
    
    Run Code Online (Sandbox Code Playgroud)

    来源:

    我从 MSYS2 项目主页上的“入门”内容中了解到这一点,此处:https: //www.msys2.org/

  17. 安装 VSCode 并将code可执行文件添加到您的 PATH 中:

    如果您还没有安装 VSCode,请从此处安装:https://code.visualstudio.com/

    可执行文件code位于"$HOME/AppData/Local/Programs/Microsoft VS Code/bin"目录中。

    通过将此行添加到文件底部,将其添加到您的 PATH 中~/.bashrc

    pacman -S mingw-w64-ucrt-x86_64-gcc
    # Press Enter or type Y then Enter to continue
    
    # Check the gcc version to ensure it installed correctly
    # Example output: `gcc.exe (Rev2, Built by MSYS2 project) 13.2.0`
    gcc --version
    
    Run Code Online (Sandbox Code Playgroud)

    关闭并重新打开所有终端,在每个终端中运行. ~/.profile以重新获取~/.profile文件的来源~/.bashrc

    现在在终端中运行code .,它将在当前目录中打开 VSCode 的新实例。现在我们正在摇滚。

  18. 安装并配置git:

    这超出了这个答案的范围,但奇怪的是,MSYS2 目前建议您安装和使用 Git For Windows 和 Git Bash (基于 MSYS2),而不是尝试MSYS2 中安装 git:https ://www.msys2.org/文档/git/

    因此,以下是我创建的一些资源链接,用于帮助您安装 Windows 版 Git / Git Bash

    1. 为 Windows 安装 Git:https ://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/issues/27#issue-1950880578
    2. 将 Git-Bash 添加到新的 Windows 终端
    3. 在 Windows 上启动 Git Bash 时运行 SSH 代理
    4. Python 无法在 git bash 命令行中工作

    至少:安装适用于 Windows 的 Git。然后,将其添加到文件底部,~/.bashrc为您的 MSYS2 环境提供最基本的git使用和访问权限:

    DIR="$HOME/AppData/Local/Programs/Microsoft VS Code/bin"
    if [ -d "$DIR" ] ; then
        PATH="$DIR:$PATH"
    fi
    
    Run Code Online (Sandbox Code Playgroud)

    关闭并重新打开所有终端,或者运行. ~/.profile以重新获取