# 利用Msys2 建立C語言開發平台 針對`Windows`系統開發C/C++編譯平台建立 比起 Linux 或是類Unix 系統Windows對於C語言支援缺乏單一最佳方案。目前來說,有以下四種方案: - Visual C++ - Cygwin - WSL - MSYS2 ## 編譯器差異 ### Viusal C++ Microsoft Visual C++ 是微軟公司的C++ 開發工具,具有整合式開發環境,可提供編輯C語言,C++ 以及C++ /CLI等程式語言。VC++ 整合了便利的除錯工具,特別是整合了微軟Windows作業系統應用程式介面(Windows API)、三維動畫DirectX API,微軟.NET框架。目前最新的版本是Microsoft Visual C++ 2022 一般來說會建議直接使用 Visual Studio ### Cygwin Cygwin 是一套運行在 Windows 上的類 Unix 子系統,主要的用途是在 Windows 上使用類 Unix 系統的命令列環境、命令列工具、開發工具等。為了要讓 Cygwin 支援 POSIX,Cygwin 附帶了一隻額外的 DLL (動態連結函式庫)。故在 Cygwin 下編譯的程式皆會依賴該 DLL。Cygwin的主要應用是在Windows系統上提供類Unix的開發環境和工具,使用戶能夠在Windows平台上開發和運行類Unix的程式。它可以讓用戶在Windows上使用Unix/Linux下常見的命令列工具、開發工具和編譯器,如gcc、make、bash等,以及支援POSIX標準的函式庫。 與Visual C++相比,Cygwin有幾個主要的區別: 1. 開發環境:Cygwin提供了一個完整的類Unix開發環境,包括了Unix/Linux下常見的命令列工具和開發工具,而Visual C++ 是微軟的整合開發環境(IDE),主要用於Windows平台的開發。 2. 編譯器:Cygwin使用的是gcc編譯器,而Visual C++ 使用的是微軟的Visual C++ 編譯器(cl.exe)。 3. 庫的依賴:Cygwin編譯的程式通常依賴於Cygwin的執行時庫(cygwin1.dll),而Visual C++ 編譯的程式通常依賴於Windows的執行時庫(如msvcrt.dll)。 4. 支援的平台:Cygwin可以在Windows上模擬Unix/Linux環境,支援跨平台開發,而Visual C++主要用於Windows平台的開發。 綜上所述,Cygwin適用於希望在Windows平台上進行Unix/Linux風格開發的用戶,而Visual C++適用於專注於Windows平台開發的用戶。 ### WSL Windows Subsystem for Linux (WSL) 是微軟為 Windows 10 和 Windows Server 2019 提供的功能,允許在 Windows 上運行本機 Linux 二進制應用程序。這為開發人員和系統管理員提供了在 Windows 操作系統上使用 Linux 工具和指令碼的能力,而無需使用虛擬機器或雙重開機。 WSL 提供了兩個主要的子系統版本:WSL 1 和 WSL 2。 1. WSL 1:這個版本提供了一個 Linux 系統調用層,它在 Windows 上翻譯 Linux 系統調用到 Windows 系統調用,從而實現了 Linux 二進制文件的運行。然而,由於這種翻譯的性能限制,WSL 1 在文件系統性能和 Docker 支持方面可能存在一些限制。 2. WSL 2:這個版本引入了虛擬化技術,將一個真正的 Linux 內核嵌入到 Windows 中,從而實現了更好的性能和完整的系統調用相容性。WSL 2 也支持與 Docker 完全兼容,並且在文件系統性能方面有顯著改進。 使用WSL,用戶可以在 Windows 中運行常見的 Linux 發行版,如 Ubuntu、Debian、Fedora 等,並且可以在這些發行版中安裝和運行 Linux 軟件包和工具,從而充分發揮了兩個操作系統的功能。這對於開發人員和系統管理員來說是一個強大的工具,因為它簡化了在混合環境中工作的流程,同時還提供了更好的性能和兼容性。 ### Msys2 MSYS2是一個在Windows平台上提供類Unix工具和環境的工具集合,旨在提供一個類似於Linux或Unix的開發環境,讓使用者能夠在Windows系統上進行開發工作。 MSYS2包含了一系列的工具和軟件,包括GNU工具和套件管理器。主要特點如下: 1. **提供類Unix環境:** MSYS2提供了一個類Unix的命令行環境,使用者可以在Windows系統上使用類Unix的命令行工具和指令碼語言,如bash、grep、awk等。 2. **套件管理器:** MSYS2具有自己的套件管理器,允許使用者方便地安裝、更新和管理各種軟件包。這包括了許多常見的開發工具、編譯器、庫和應用程序,如gcc、make、vim等。 3. **整合開發環境:** 使用者可以在MSYS2中進行軟件開發,包括C/C++、Python、Ruby等語言的開發。它提供了一個完整的開發環境,包括編輯器、調試器和版本控制系統等工具。 4. **跨平台支援:** MSYS2具有良好的跨平台支援,允許使用者在Windows、Linux和其他Unix-like系統上共享相同的開發環境和工具。 總的來說,MSYS2是一個強大的工具,為在Windows上進行開發工作的使用者提供了方便和彈性。它的類Unix環境和套件管理器使得在Windows系統上進行開發工作變得更加流暢和高效。 在本文內我們將介紹如何使用 Msys2 做為開發環境。 ## 開發平台建立(Msys2) 1. 新增Windows環境變數 ![image](https://hackmd.io/_uploads/B1LS4Wg1C.png) 2. 下載[Msys2.exe](https://github.com/msys2/msys2-installer/releases/download/2024-01-13/msys2-x86_64-20240113.exe)並安裝 ![image](https://hackmd.io/_uploads/SyB4PZgkR.png) 3. 使用Windows Termainal使用Mingw64 ```json= { "commandline": "C:/msys64/msys2_shell.cmd -defterm -here -no-start -mingw64", "font": { "face": "MesloLGS NF", "size": 12.0 }, "guid": "{71160544-14d8-4194-af25-d05feeac7233}", "icon": "C:/msys64/mingw64.ico", "name": "Mingw64", "startingDirectory": "%USERPROFILE%" } ``` ### 中文亂碼問題 在`家目錄`下修改 `bashrc`新增下列指令 ```sh= chcp.com 65001 ``` ### 使用ZSH ```sh= pacman -S zsh ``` 新增 `bashrc` 使預設開啟`ZSH` ```sh= if [ -t 1 ]; then exec zsh fi ``` #### 更換主題與套件 Oh-my-zsh ```shell! sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" ``` p10k ```shell! git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k ``` 語法高亮 ```shell! git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting ``` 自動補全 ```shell! git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions ``` 修改`zshrc`內容 ```bash! ZSH_THEME="powerlevel10k/powerlevel10k" ``` ```bash! plugins=(git zsh-syntax-highlighting zsh-autosuggestions) ``` 大功告成 ![image](https://hackmd.io/_uploads/S1bcFWx1C.png) ## 新增相關套件 GCC套件 ```shell! pacman -Sy -y mingw-w64-x86_64-gcc pacman -Sy -y --needed base-devel mingw-w64-x86_64-toolchain ``` 修改環境變數 `C:\msys64\mingw64\bin\` ![image](https://hackmd.io/_uploads/r1dXqZxJA.png) ### 其他常用套件 ```shell! pacman -S vim openssh git make ``` 更新Msys2 ```shell! pacman -Suy ``` ## Visual studio code 相關修改 在 `settings.json` 將MINGW64修改為Visual Studio Code 預設終端機 ```json= "terminal.integrated.defaultProfile.windows": "MINGW64", "terminal.integrated.profiles.windows": { "MINGW64": { "path": "C:\\msys64\\usr\\bin\\bash.exe", "label": "MSYS2", "args": [ "--login", "-i" ], "env": { "MSYSTEM": "MINGW64", "CHERE_INVOKING": "1", "MSYS2_PATH_TYPE": "inherit" } } } ``` 如下,也一併確認是否成功將套件匯入。 ![image](https://hackmd.io/_uploads/Ska73Ze1C.png) ## 修改SSH家目錄問題 修改 `C:\msys64\etc\ssh` 的`ssh_config` 將所有的 `~` 修改為家目錄位置,如:`\c\Users\YOU` 如下: ```conf= IdentityFile ~/.ssh/id_rsa IdentityFile ~/.ssh/id_dsa IdentityFile ~/.ssh/id_ecdsa IdentityFile ~/.ssh/id_ed25519 . . . UserKnownHostsFile /c/Users/Defu/.ssh/known_hosts.d/%k ``` 改為 ```conf= IdentityFile /c/Users/YOU/.ssh/id_rsa IdentityFile /c/Users/YOU/.ssh/id_dsa IdentityFile /c/Users/YOU/.ssh/id_ecdsa IdentityFile /c/Users/YOU/.ssh/id_ed25519 . . . UserKnownHostsFile /c/Users/YOU/.ssh/known_hosts ``` 至此,可以在Windows上使用大部分Linux相關環境與編輯能功能了 ![image](https://hackmd.io/_uploads/rylIkfgkA.png)