2012-07-12 77 views
10

我們有一個大項目,在大約300個DLL中有大於1M行的代碼。 到目前爲止,我們一直在使用VS6。VS2008中的巨大OBJ文件C++編譯與VS6相比較

我已經將一切轉換爲VS2008,所有編譯,鏈接和更重要的 - 運行!

==>但是...由此產生的編譯後的OBJ文件是X 10更大,鏈接速度非常慢,鏈接器經常打擊大於1GB的內存。

部分含義是我需要用/ bigobj編譯某些項目。

結果是從桌面上的1:45左右開始到3h。 DLL和LIB與舊版VS6版本的大小大致相同。

我已閱讀所有我可以在這裏找到,但沒有找到解決這個問題的辦法。 如果它是額外的DEBUG信息 - 我不想要它。我以前吃夠了。 發佈中的尺寸增加,但不是太多...

任何人有什麼想法?或者,我是唯一選擇將項目分解爲更小的單元?重構我唯一的希望嗎?!肯定有一個祕密的標誌我錯過了...


EDIT1(13/07/2012 12:20BST)我DUMPBIN通過VS6與VS2008創建一個OBJ相比 。 2008年的那個 出現好像「靜態鏈接」。在VS6中,它包含當前DLL中的幾個符號。在VS2008中,它包含來自(可能)所有依賴的庫的符號。 VS6和VS2008的Dumpbin大小分別爲66kb和32,000kb。


+2

嘗試在項目設置(C++分支)中禁用「調試信息」。 – 2012-07-12 17:19:15

+7

_「我們有一個大項目,大約300個DLL中有大於1M的代碼,到目前爲止我們一直在使用VS6。」_我永遠不會再抱怨我的工作。 – Luke 2012-07-12 17:31:42

+0

@IvanShcherbakov - 這不會阻止我輕鬆調試嗎? – aabramovich 2012-07-12 17:32:54

回答

5

檢查您的調試選項。 /Z7會導致大的.OBJ文件,/Zi將相同的信息放在單獨的.PDB文件中。

編譯器選項/Oi可以通過內聯內聯函數來幫助,然後內聯函數不再需要鏈接。無論如何你可能不想調試memset

關閉/Gm(增量重建),以便您可以打開/MP(並行構建)。同時關閉/Gy - 雖然它使較小的EXE,它會導致更大的OBJ文件和更慢的鏈接。

+0

Thanks @MSalters。我們使用/ ZI,我們使用/ MP,GY關閉,我也玩過增量與非增量鏈接,非遞增是痛苦的。現在 - 將在12h報告 – aabramovich 2012-07-12 18:58:09

+0

增量鏈接內存不足,我無法找到解決方法。對象大小減少了大約25%,但它們仍然很大。我無法使用/ 3GB標誌開發人員(erm)使用總共3GB的筆記本電腦...我會嘗試更換操作系統,因爲我有XP ... – aabramovich 2012-07-13 09:07:33

+1

'/ 3GB'標誌指的是a建立可執行文件的地址空間,並且不會影響編譯器或鏈接器本身。此外,這是3GB的地址空間,其中包括內存映射文件,而不是RAM。 – MSalters 2012-07-13 09:42:55