Linker fatal error: LNK1102: out of memory

現象

在持續集成流水線中用msbuild編譯32位的程序偶先報錯:Linker fatal error: LNK1102: out of memory。

一般解決方法

谷歌之後找到了微軟的官方文章,裏面寫了產生這個問題的原因和解決方法:https://support.microsoft.com/en-us/help/2891057/linker-fatal-error-lnk1102-out-of-memory
解釋:大概意思就是,link的時候申請的堆空間太大了,exe虛擬地址空間都不夠了,推薦設置PreferredToolArchitecture=x64來使用64位的編譯工具。
但是改了各種地方:
(1)環境變量
(2)$(VCTargetsPath)\Microsoft.Cpp.Default.props裏面加上PreferredToolArchitecture屬性並設置爲x64
(3)在經常出錯的vcxproj中加上PreferredToolArchitecture屬性並設置爲x64。
都不好使,鬱悶

我的解決方法

最後發現,在我們的持續集成流水線中我們是這樣設置msbuild環境的:

%comspec% /k ““C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat”” x86

查看這個批處理:
在這裏插入圖片描述
發現了很多不同的工具集架構,他們的區別如下:
在這裏插入圖片描述

結合上面兩點,突然意識到vcvarsall.bat批處理後面的參數就決定了我使用哪個工具集,所以就算我再怎麼設置PreferredToolArchitecture=x64最後在編譯的時候也沒用(這種情況應該是對直接用devenv.exe有用)

最後設置vcvarsall.bat後面的參數爲amd64_x86就好使了,代表我需要用64位的工具輸出x86的製品,防止鏈接的時候申請空間溢出。

參考鏈接:https://docs.microsoft.com/en-us/cpp/build/building-on-the-command-line?view=vs-2019#developer_command_file_locations

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章