2025年4月24日 星期四

MSYS2 編譯器通常放哪

MSYS2 通常安裝在 C:\msys64,那編譯器位置就根據你安裝的 toolchain(如 mingw64、ucrt64、clang64) 而定。

🎯 常見 MSYS2 編譯器路徑對照表

✅ 如果你使用的是 MinGW-w64 (64-bit GCC)

Toolchain編譯器 binary 路徑常用變數名
mingw64C:\msys64\mingw64\bin\gcc.exex86_64-w64-mingw32-gcc
ucrt64C:\msys64\ucrt64\bin\gcc.exe(有時改成 ucrt gcc)
clang64C:\msys64\clang64\bin\clang.execlang for Windows
msys2(純 POSIX)C:\msys64\usr\bin\gcc.exe(不建議用來編 Win binary)只適合 MSYS shell 程式

🧭 如何確認你用的是哪個 toolchain?

打開 MSYS2 shell(通常是這些其中之一):

  • MSYS2 MinGW 64-bit(對應 mingw64

  • MSYS2 UCRT64(對應 ucrt64

  • MSYS2 CLANG64

  • MSYS2 MSYS(純 POSIX,較不推薦編 Windows EXE)

然後在 shell 輸入:

which gcc

範例輸出(你用哪個 shell 就會指到哪):

/mingw64/bin/gcc

✅ 編譯器對應的「CC」名稱

路徑Makefile 用法
/mingw64/bin/gccCC=x86_64-w64-mingw32-gcc
/ucrt64/bin/gccCC=x86_64-w64-mingw32-gcc(或指定 ucrt 變種)
/clang64/bin/clangCC=clang,可能加 -target
/usr/bin/gcc⚠️ 不建議用來產出 .exe

📦 你可以這樣設定你的 build.sh

# 編譯 Windows 程式用 MSYS2 mingw64
export PATH=/c/msys64/mingw64/bin:$PATH ./build.sh windows

或直接修改你的 Makefile:

CC ?= x86_64-w64-mingw32-gcc # 或 /c/msys64/mingw64/bin/gcc

💡 額外建議:用 pacman 裝工具鏈(MSYS2 專用)

pacman -Syu
pacman -S mingw-w64-x86_64-gcc

裝好後你就能在 MSYS2 MinGW 64-bit shell 中愉快使用 x86_64-w64-mingw32-gcc 😎


自動判斷當前 shell 和工具鏈的 build.sh

根據你現在是在 哪個 MSYS2 shell 自動選擇合適的 toolchain 編譯器,例如:

  • 如果你在 MSYS2 MinGW 64-bit shell → 使用 mingw64 工具鏈

  • 如果你在 MSYS2 UCRT64 shell → 使用 ucrt64

  • 如果你在 Linux shell → 使用系統 gcc

  • 如果是 MSYS2 環境但沒指定 toolchain → 提示你不要用 MSYS 直接編譯 Windows 程式


✅ 終極版本 build.sh – 自動偵測平台 & toolchain

#!/bin/bash
set -e PLATFORM="$1" if [ -z "$PLATFORM" ]; then echo "❗ 請指定平台參數:linux 或 windows" echo "✅ 範例: ./build.sh linux 或 ./build.sh windows" exit 1 fi # 自動偵測工具鏈 detect_msys2_toolchain() { if [[ "$MSYSTEM" == "MINGW64" ]]; then echo "mingw64" elif [[ "$MSYSTEM" == "UCRT64" ]]; then echo "ucrt64" elif [[ "$MSYSTEM" == "CLANG64" ]]; then echo "clang64" elif [[ "$MSYSTEM" == "MSYS" ]]; then echo "❌ MSYS shell 不適合用來編譯 Windows 程式,請改用 MinGW/UCRT/Clang shell" exit 1 else echo "unknown" fi } if [ "$PLATFORM" == "linux" ]; then echo "🔧 編譯 Linux 版本..." make clean make elif [ "$PLATFORM" == "windows" ]; then TOOLCHAIN=$(detect_msys2_toolchain) case "$TOOLCHAIN" in mingw64) export CC=x86_64-w64-mingw32-gcc ;; ucrt64) export CC=x86_64-w64-mingw32-gcc ;; clang64) export CC=clang export CFLAGS="-Wall -D_WIN32 -target x86_64-windows-gnu" ;; *) echo "❌ 無法判斷 MSYS2 toolchain,請使用合適的 MSYS2 MinGW shell" exit 1 ;; esac echo "🔧 編譯 Windows 版本(toolchain: $TOOLCHAIN)..." make clean make \ CFLAGS="${CFLAGS:--Wall -D_WIN32}" \ LDFLAGS="-lws2_32" \ TARGET_SUFFIX=".exe" else echo "❌ 不支援的平台:$PLATFORM" echo "請使用:linux 或 windows" exit 1 fi

🧪 使用方式

編譯 Linux 程式(例如 Ubuntu)

./build.sh linux

編譯 Windows 程式(用 MSYS2 開啟 MSYS2 MinGW 64-bit shell)

./build.sh windows

🔍 判斷 MSYSTEM 變數的用意?

MSYS2 ShellMSYSTEM
MSYS2 MinGW 64-bitMINGW64
MSYS2 UCRT64UCRT64
MSYS2 CLANG64CLANG64
MSYS2(純 POSIX)MSYS

🔒 Bonus 安全性:

  • 自動提示你「不要在 MSYS shell 下編譯 .exe」

  • 編譯器會自動根據 shell 推定

  • 支援 Linux 全自動

沒有留言:

張貼留言