現象
程式碼在其他環境正常,放入 VS2013 專案編譯失敗,錯誤訊息截圖不可見,但回覆提到「VISUAL STDIO 2013的環境,不行」。
VS2013 常見不相容點
| 項目 | VS2013 行為 | 對應修正 |
| C++11/14 支援度 | 部分支援 (無泛型 lambda、無變數模板、無 `std::make_unique`) | 改用 C++11 相容寫法,或升級工具集 (v140/v141/v142) |
| 預處理器差異 | `_MSC_VER == 1800`,某些標頭檔判斷邏輯不同 | 檢查 `#if _MSC_VER` 區塊 |
| 標準庫實作 | 較舊 STL,`std::regex` 不完整、`std::to_string` 可能缺失 | 使用 `boost::lexical_cast` 或手寫轉換 |
| 專案設定遺漏 | 預設字元集可能為 MBCS,非 Unicode | 專案屬性 → 一般 → 字元集:使用 Unicode |
| 平台工具集 | 預設 v120 (VS2013) | 若程式碼需新標準,安裝 VS2015+ Build Tools 並切換至 v140+ |
排查步驟
- 查看完整錯誤清單:輸出視窗 → 顯示輸出來源:建置 → 複製前 20 行錯誤。
- 最小重現:新建空專案,僅貼上核心類別/函式,嘗試編譯,隔離是專案設定還是程式碼問題。
- 檢查標頭檔順序:`#include ` 必須在其他標頭前,避免巨集汙染。
- 預編譯標頭:VS2013 預設啟用 `stdafx.h`,若未包含會報 `unexpected end of file while looking for precompiled header`。解法:專案屬性 → C/C++ → 預編譯標頭 → 不使用預編譯標頭。
- 運行期程式庫匹配:所有靜態庫、DLL、EXE 必須相同 (`/MD`、`/MT`、`/MDd`、`/MTd`),否則連結錯誤 LNK2005/LNK2038。
快速修正清單
- ☐ 專案 → 屬性 → C/C++ → 語言 → C++ 語言標準:ISO C++14 標準 (`/std:c++14` 需 VS2017+,VS2013 無此選項)
- ☐ 專案 → 屬性 → C/C++ → 程式碼產生 → 運行期程式庫:多執行緒 DLL (`/MD`)
- ☐ 專案 → 屬性 → 連結器 → 一般 → 遞增連結:否 (`/INCREMENTAL:NO`)
- ☐ 移除 `#pragma comment(lib, ...)` 改用專案屬性 → 連結器 → 輸入 → 額外相依性
根本建議
**VS2013 已於 2024 年 4 月結束支援**。新專案請直接使用 **Visual Studio 2022 Community** (免費) 或 **VS Code + MSVC/Clang**。舊專案遷移通常只需調整少數語法與專案設定,長遠收益遠大於維護舊工具鏈成本。