在 Windows 7 上使用 Code::Blocks 12.11 + MinGW 編譯 FLTK 專案時,若出現大量 undefined reference to `_Unwind_Resume' 和 __gxx_personality_v0' 錯誤,核心原因是 FLTK 預編譯庫 (`.a`) 與當前 MinGW 版本的 C++ 異常處理 ABI (Application Binary Interface) 不兼容。
_Unwind_Resume、__gxx_personality_v0 是 GCC C++ 異常處理機制的內部符號,屬於 libgcc / libstdc++。.a 檔若是用不同版本的 MinGW (如 GCC 3.x vs 4.x、SJLJ vs DWARF 異常模型) 編譯,其內部引用的異常處理符號與你當前鏈接的 libgcc 不匹配,導致鏈接器找不到符號。使用當前專案完全相同的編譯器從源碼編譯 FLTK,確保 ABI 完全一致。
fltk-1.3.5-source.tar.gz)。./configure --prefix=/mingw --disable-shared
make
make install
libfltk.a 等靜態庫將直接兼容你的工具鏈。注意:Windows 下建議使用 MSYS2 環境執行 ./configure,或使用 CMake 生成 Code::Blocks 專案檔 (cmake -G "CodeBlocks - MinGW Makefiles") 再編譯。
若不想自行編譯,必須確保下載的預編譯 FLTK 庫與你的 MinGW 完全匹配:
posix vs win32。檢查你的 MinGW 版本:gcc -v 輸出中會顯示 --enable-sjlj-exceptions 或 --with-dwarf2。下載 FLTK 時務必選擇相同配置的預編譯包。
在 Code::Blocks 專案編譯選項中加入:-fno-exceptions。這會禁用 C++ 異常處理,可能繞過符號缺失,但 FLTK 內部可能使用異常,運行時會崩潰或行為未定義。
C:\fltk\lib)。fltk, fltk_images, fltk_jpeg, fltk_png, fltk_z, ws2_32, gdi32, comdlg32, imm32, ole32, oleaut32, uuid。-mwindows (隱藏控制台視窗)。#include <FL/Fl.H> 等頭檔路徑在 Compiler → Search directories → Compiler 中。編譯官方 test/hello.cxx:
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Box.H>
int main() {
Fl_Window *w = new Fl_Window(340, 180);
new Fl_Box(20, 40, 300, 100, "Hello, FLTK!");
w->end();
w->show();
return Fl::run();
}
若能正常彈出視窗,恭喜你,環境已就緒!
pacman -S mingw-w64-fltk 安裝的庫與 Code::Blocks 自帶的 MinGW,它們是不同工具鏈。CMakeLists.txt,用 CMake 生成專案檔最不易出錯。遵循「同工具鏈編譯依賴庫」原則,即可徹底解決此類 ABI 不兼容問題。