在使用 MinGW-w64 開發 64 位元應用程式時，選擇適合的異常處理機制主要取決於你的需求和特定情況。以下是對三種異常處理機制的比較，幫助你決定最適合的設定：

1. **SJLJ (setjmp/longjmp)**：
   - 優點：支援 32 位元和 64 位元，可以處理異常。
   - 缺點：即使不拋出異常，會有一定的性能開銷，通常在最壞情況下約 15% 的效能損失。對於性能要求高的應用程式，這可能是一個不利因素。

2. **DWARF (DW2, dwarf-2)**：
   - 優點：在 32 位元上運作良好，沒有永久執行時開銷。
   - 缺點：僅支援 32 位元，且無法在 Windows 系統 DLL 或 Visual Studio 編譯的 DLL 中有效運作，這使得它在64位元環境中不適用。

3. **SEH (Structured Exception Handling)**：
   - 優點：是零開銷的異常處理機制，非常適合 64 位元環境。
   - 缺點：不適合在所有平台和情況下使用，但對於大多數 Windows 應用程式來說，它是最佳選擇。

### 建議的編譯設定
考慮到以上的比較，以下是一般建議的編譯設定：

- **若是開發 64 位元應用程式**，建議使用 **SEH** 作為異常處理機制，因為它提供了最佳的性能和有效性。
- 在編譯命令中，可以加入 `-fexceptions` 來啟用異常處理，並確保你的代碼中適當處理異常情況。

例如，使用以下命令進行編譯：
```bash
g++ -m64 -fexceptions -o my_program my_program.cpp
```

在某些情況下，如果你的程式需要與其他不使用 SEH 的 DLL 一起工作，可能需要考慮其他機制，但對於大多數現代 Windows 應用程式，SEH 是最佳的選擇。

總結來說，當開發 64 位元應用程式時，建議使用 **SEH** 並在編譯時進行設定，這樣可以獲得最佳的性能和用於異常處理的靈活性。
在使用 MinGW-w64 開發 64 位元應用程式時，如何選擇適合的異常處理機制（SJLJ、DWARF、SEH）？是否有推薦的編譯設定？
**MinGW**（**Min**imalist **G**NU for **W**indows），又稱 **mingw32**，是將 GCC 編譯器和 GNU Binutils 移植到 Win32 平台下的產物，包括一系列標頭檔（Win32API）、函式庫和可執行檔。

另有可用於產生 32 位元及 64 位元 Windows 可執行檔的 **MinGW-w64** 專案，是從原本 MinGW 產生的分支。如今已經獨立發展。

## 歷史

MinGW 是從 Cygwin（1.3.3 版）基礎上發展而來。

## 程式語言支援

GCC 支援的語言大多在 MinGW 也受支援，其中涵蓋 C、C++、Objective-C、Fortran 及 Ada。

對於 C 語言之外的語言，MinGW 使用標準的 GNU 執行時函式庫，如 C++ 使用 GNU libstdc++。

但是 MinGW 使用 Windows 中的 C 執行時函式庫。因此用 MinGW 開發的程式不需要額外的第三方 DLL 支援就可以直接在 Windows 下執行，而且也不一定必須遵從 GPL 授權條款。這同時造成了 MinGW 開發的程式只能使用 Win32API 和跨平台的第三方函式庫，而缺少 POSIX 支援，大多數 GNU 軟體無法在不修改原始碼的情況下用 MinGW 編譯。

## 組件

MinGW 支援根據 `<name>.lib` 和 `<name>.dll` 命名的動態函式庫，以及遵循 Unix 和類 Unix 系統中常見的 `lib<name>.a` 命名約定的靜態函式庫。

此外，MinGW 的一個被稱為 _MSYS_(_最小系統_) 的組件提供了一個輕量級類 Unix shell 環境的 Windows 埠，包括 rxvt 和一些足以使 autoconf 指令碼執行的 POSIX 工具，但它不提供 C 編譯器或區分大小寫的檔案系統。

## 與 Cygwin 比較

Cygwin 與 MinGW 皆可用來移植 Unix 軟體到 Windows，但它們採用截然不同的實作。Cygwin 旨在提供一個完整的 POSIX 層，包括主流 Unix 的系統呼叫及函式庫實作；其重視相容性優先於效能。相對的，MinGW 則著重簡化與效能。因此，它並不提供某些難以用 Windows API 實作的 POSIX API，例如 `fork()`，`mmap()` 和 `ioctl()`。使用跨平台函式庫寫成的應用程式，若函式庫本身已移植到了 MinGW（例如 SDL、wxWidgets、Qt 或 GTK+），則那些應用程式通常也容易用 MinGW 編譯。

用 Cygwin 寫成的 Windows 程式，因為是執行在公共著作權的相容 DLL 上，所以 DLL 必須隨著程式原始碼一起發布。MinGW 則不需要相容層，因為基於 MinGW 的程式是直接呼叫 Windows API 編譯的。

MinGW 搭配 MSYS 可以產生一個小卻完整的執行環境，讓程式可以載入隨身裝置當中，卻不動到登錄檔或產生額外檔案。

在 POSIX 系統下，用 MinGW-GCC 交叉編譯 Windows 應用程式也是可行的。這意味著開發者不需要安裝 Windows 與 MSYS 才能編譯 Windows 軟體，或 Windows+Cygwin 軟體。

## 異常機制

MinGW 編譯器在實作異常機制時，有三種可選方式：

* SJLJ (setjmp/longjmp)：可用於 32/64 位元，但不是零代價的：即使不丟擲異常，仍會有一定的效能損失（在最差情形下～15%）。
* DWARF (DW2, dwarf-2)：只能用於 32 位元，沒有永久的執行時開銷，需要呼叫堆疊是 dwarf-enabled，這意味著異常對於 Windows system DLLs 或 Visual Studio 編譯的 DLLs 的異常不能被丟擲。
* SEH：零開銷。

## MinGW-w64

MinGW-w64 是 2005 年由 OneVision Software 根據淨室設計原則而獨立開發，以解決當時的 MinGW 專案更新緩慢，缺少新的重要的 API 以及 64 位元支援。2008 年 MinGW-w64 專案開源，由 Kai Tietz 維護。

* SourceForge.net 上的 MinGW-w64 官方的下載站點 提供由 MinGW-Builds 等專案組製作的預編譯版。編譯器分 64 位元版和 32 位元版、分別包含 sjlj、drawf、seh 例外處理機制、分別支援 POSIX 執行緒模式或 Win32 執行緒模式。使用者可根據需要下載不同版本。例如，64 位元的 seh、POSIX 執行緒的最新穩定版本的 gcc 套件的下載目錄為：Toolchains targetting Win64 → Personal Builds → mingw-builds → 7.3.0 → threads-posix → seh

## 非官方編譯器整合安裝套件

很多非官方組織提供了包含一系列整合工具鏈的 MinGW 安裝套件。其中大部分基於 MinGW-w64 專案。

* TDM-MinGW GCC （頁面存檔備份，存於網際網路檔案館） MinGW 編譯器安裝套件，整合了 32 位元、64 位元的 GCC 5.1.0 c/c++/fortran 編譯器等。
* 64 位元 Win32 執行緒模式 （頁面存檔備份，存於網際網路檔案館）。特色是包含很多第三方函式庫，如 boost、libpng、zlib、coreutils、grep、make、w32api、sed、git 等等；且為最新的 GCC 版本。
* MinGW package installer from Equation.com （頁面存檔備份，存於網際網路檔案館） 該網站提供了 32 位元和 64 位元的 GCC 以及 nightly snapshot 版本的安裝套件，以及 gdb 的 nightly snapshot 安裝套件。
* MinGW-w64 - for 32 and 64 bit Windows （頁面存檔備份，存於網際網路檔案館） 最新的 nightly snapshot 的編譯後的軟體。但似乎沒有整合 iconv?

## 參見

* Cygwin
* POSIX

## 參考資料

## 外部連結

* MinGW 官方網站 （頁面存檔備份，存於網際網路檔案館）。
* OSDN 上的 MinGW 官方的下載站點 （頁面存檔備份，存於網際網路檔案館）。
**MinGW**（**Min**imalist **G**NU for **W**indows），又稱 **mingw32**，是將 GCC 編譯器和 GNU Binutils 移植到 Win32 平台下的產物，包括一系列標頭檔（Win32API）、函式庫和可執行檔。

另有可用於產生 32 位元及 64 位元 Windows 可執行檔的 **MinGW-w64** 專案，是從原本 MinGW 產生的分支。如今已經獨立發展。

## 歷史

MinGW 是從 Cygwin（1.3.3 版）基礎上發展而來。

## 程式語言支援

GCC 支援的語言大多在 MinGW 也受支援，其中涵蓋 C、C++、Objective-C、Fortran 及 Ada。

對於 C 語言之外的語言，MinGW 使用標準的 GNU 執行時函式庫，如 C++ 使用 GNU libstdc++。

但是 MinGW 使用 Windows 中的 C 執行時函式庫。因此用 MinGW 開發的程式不需要額外的第三方 DLL 支援就可以直接在 Windows 下執行，而且也不一定必須遵從 GPL 授權條款。這同時造成了 MinGW 開發的程式只能使用 Win32API 和跨平台的第三方函式庫，而缺少 POSIX 支援，大多數 GNU 軟體無法在不修改原始碼的情況下用 MinGW 編譯。

## 組件

MinGW 支援根據 `<name>.lib` 和 `<name>.dll` 命名的動態函式庫，以及遵循 Unix 和類 Unix 系統中常見的 `lib<name>.a` 命名約定的靜態函式庫。

此外，MinGW 的一個被稱為 _MSYS_(_最小系統_) 的組件提供了一個輕量級類 Unix shell 環境的 Windows 埠，包括 rxvt 和一些足以使 autoconf 指令碼執行的 POSIX 工具，但它不提供 C 編譯器或區分大小寫的檔案系統。 **MinGW**（**Min**imalist **G**NU for **W**indows），又稱 **mingw32**，是將 GCC 編譯器和 GNU Binutils 移植到 Win32 平台下的產物，包括一系列標頭檔（Win32API）、函式庫和可執行檔。

另有可用於產生 32 位元及 64 位元 Windows 可執行檔的 **MinGW-w64** 專案，是從原本 MinGW 產生的分支。如今已經獨立發展。

## 歷史

MinGW 是從 Cygwin（1.3.3 版）基礎上發展而來。

## 程式語言支援

GCC 支援的語言大多在 MinGW 也受支援，其中涵蓋 C、C++、Objective-C、Fortran 及 Ada。

對於 C 語言之外的語言，MinGW 使用標準的 GNU 執行時函式庫，如 C++ 使用 GNU libstdc++。

但是 MinGW 使用 Windows 中的 C 執行時函式庫。因此用 MinGW 開發的程式不需要額外的第三方 DLL 支援就可以直接在 Windows 下執行，而且也不一定必須遵從 GPL 授權條款。這同時造成了 MinGW 開發的程式只能使用 Win32API 和跨平台的第三方函式庫，而缺少 POSIX 支援，大多數 GNU 軟體無法在不修改原始碼的情況下用 MinGW 編譯。

## 組件

MinGW 支援根據 `<name>.lib` 和 `<name>.dll` 命名的動態函式庫，以及遵循 Unix 和類 Unix 系統中常見的 `lib<name>.a` 命名約定的靜態函式庫。

此外，MinGW 的一個被稱為 _MSYS_(_最小系統_) 的組件提供了一個輕量級類 Unix shell 環境的 Windows 埠，包括 rxvt 和一些足以使 autoconf 指令碼執行的 POSIX 工具，但它不提供 C 編譯器或區分大小寫的檔案系統。 **Mingw-w64** 是自由及開放原始碼軟體開發環境，用於創建 Microsoft Windows 應用程式。從 2005–2008 從 MinGW (_Minimalist GNU for Windows_) 分支出來。

Mingw-w64 包括對 GCC、GNU Binutils 的 Windows 版本的移植（彙編器、連結器、庫文件管理器），一套自由可分發的 Windows 特定的頭文件與靜態導入庫以使用 Windows API，一個 Windows 本地版本的 GNU 的調試器，以及其它多種工具。

Mingw-w64 可運行於本地 Microsoft Windows 平台，"cross-native" 在 MSYS2 或 Cygwin。Mingw-w64 能生成 32 - 或 64 - 位可執行程序，運行於 `i686-w64-mingw32` 或 `x86_64-w64-mingw32` 目標平台。 ## 歷史

2005 年，OneVision Software 遵照淨室設計原則，開始開發 Mingw-w64，因為最初的 MinGW 項目更新太慢，遲遲不支持 64 位環境開發。2008 年，OneVision 捐獻這個項目給開源社區。

MinGW-w64 提供了更全面的 Win32 API 支持，包括：

* 更好的 C99 支持
* POSIX 執行緒 (pthreads) 支持
* GCC multilib, 允許同時安裝 32 位與 64 位庫
* Unicode 入口點 (wmain/wWinMain)
* DDK (來自 ReactOS)
* DirectX (來自 Wine)
* 大文件支持
* Win64 支持
* 在 x86-64 (從 gcc 4.8+) 上，結構化異常處理 (SEH) 代替 DWARF 或 sjlj
* 一些有用工具如 `gendef`，`widl` (一個 MIDL 編譯器來自 Wine)

Mingw-w64 還維護 winpthreads，一個包裝庫類似於 pthreads-win32, 實現了 C++11 執行緒庫 `<thread>`, `<future>`, `<mutex>`。

## MSYS2

MSYS2 ("minimal system 2") 是用於 Microsoft Windows 的軟體發布與開發平台，基於 Mingw-w64 與 Cygwin，把 Unix 環境中的代碼移植到 Windows。