項目使用 Ubuntu 10 64 位,GCC 4.4.3,Boost 1.55 以源碼形式內嵌(相對路徑包含)。編譯選項 -Wall -Wextra -Werror -Wconversion(最高警告級別)。單獨測試正常,但整合編譯時 STL 容器行為異常(如 map 空時 begin()!=end(),插入崩潰/死循環)。經定位,問題在對 boost/thread.hpp 使用 #pragma GCC push_options / #pragma GCC diagnostic ignored "-Wconversion" 後出現。
GCC 的 push_options / pop_options 在 GCC 4.4 實現有缺陷,導致後續頭文件編譯時選項狀態錯誤,影響 STL 內部實現(如迭代器、分配器等)。Boost 作為第三方庫,其內部代碼不應受項目警告選項污染。
GCC 提供 -isystem dir 選項,將目錄視為系統頭文件目錄:
-Wall 等影響)。-I 但高於標準系統目錄。將 Boost 所在目錄(如 ${ProjDir}/../../others)改用 -isystem 而非 -I 包含,問題完美解決。
使用 gcc -E 查看預處理輸出,確認系統頭文件標記。編譯選項調整後,STL 容器行為恢復正常,編譯通過無警告錯誤。
-isystem 包含,避免警告選項污染。push_options 有已知 Bug,高版本 GCC 已修復。-I,可在包含第三方庫前後用 #pragma GCC system_header 標記(但不如 -isystem 乾淨)。