LNK1201: Visual C++ 無法產生 PDB 的解法


前陣子遇到一個大型專案下 Visual C++ 6.0 編譯失敗的問題,

其錯誤訊息是 Linker Tools Error LNK1201 (Fatal Error C1060),

根據 Microsoft Docs 得知這個錯誤訊息是由 Linker 無法產生 PDB 造成,

於是先行確認磁碟可用空間、檔案權限 ... 等,但始終都查不出任何問題,

後來根據 Change Set 退回比較舊的版本就沒事了,而且這個問題也只發生在 Debug 版,

於是就在猜測是不是 PDB 會有大小上的限制。

最後根據 PDB 大小這個關鍵字在 Stack Overflow 發現也有人在 Visual C++ 2010 遇到類似的狀況。

根據 Stack Overflow 這篇討論串整理出來的最終結論是:

PDB 是一個 MSF (Multi-Stream Format) File,Linker 在創建 PDB 時會以預設 2 KB Page Size 創建 (無法藉由參數修改 Linker 設定),因此 PDB 檔案大小是有限制的。

不過幸運的是,Compiler 在創建 PDB 時用的 Page Size 為 Linker 的 2 倍 (即 4KB Page Size),而且 Linker 在發現有 PDB 的狀況下會使用原先 PDB 的設定。

因此藉由在 Pre-Link Event 中增加下列指令讓 Compiler 先行創建一個初始 PDB ,就可以增加 PDB 檔案大小的上限。

cl -c "dummy_empty.cpp" /Zi /Fd"$(TargetDir)$(TargetName).pdb" 

後來我們嘗試 Stack Overflow 這個神奇的解法後,真的就編譯成功了 XD 

(唯一的差異是,Visual C++ 6.0 Linker 創建 PDB 預設是以 128 Byte Page Size,所以預設 PDB 最大只能來到 64 MB)


留言

這個網誌中的熱門文章

[面試心得] Synology / 群暉 - Product Developr

[面試心得] VICI Holdings / 威旭(高頻交易) - Software Engineer

[面試心得] GoFreight / 聖學科技(Freight Forwarder) - Full-Stack Engineer