2012-07-05 57 views
5

我有一個MSVC++項目由可執行文件,幾個自己的靜態庫和一些預編譯的靜態第三方庫組成。該exe使用增量鏈接,以加快構建時間。Exe執行完全鏈接時,庫更改,儘管增量鏈接

當我更改可執行項目中的.cpp文件時,編譯+鏈接非常快(< 10秒)。
但是,當我在我自己的一個庫中更改.cpp文件時,可執行項目似乎正在對其使用的每個庫執行完整鏈接。
我不太確定,如果它實際上是一個完整的鏈接,但從「vc90.pdb找不到」鏈接器警告,我可以告訴它鏈接到一些根本沒有改變的外部庫。

下面是項目結構的一個例子:

  • 預編譯的第三方庫ExtLib1ExtLib2ExtLib3
  • 自己的圖書館MyLib,使用第三方的lib ExtLib1
  • 自己的Exe MyExe,使用MyLibExtLib1-3

MyLib更改.cpp文件,然後將導致MyExe被鏈接到MyLibExtLib1ExtLib2ExtLib3,即使增量鏈接被打開。

一個完整的鏈接需要大約5分鐘在我的項目中,所以我問:有什麼方法可以重新鏈接只更改的庫?

回答

2

這是對incremental linking的介紹。它列出了會導致完整鏈接的情況。其中一個是「用/ Yu/Z7選項編譯的對象已更改」,請檢查MyLib是否抓住它。

+0

我的圖書館是用/ Yu/Zi編譯的..我試圖禁用該庫的預編譯頭文件(即:去除/餘)但沒有太大的變化。也許鏈接器實際上試圖做一個增量鏈接,但幾乎可以鏈接任何東西。明天將不得不進一步調查 – 2012-07-05 15:54:28

1

當靜態庫的變化總是會有一個完整的鏈接,可執行,至少在Visual Studio 2013,你可能會得到這樣的事情在輸出窗口:

2>Link: 
2> LINK : library changed; performing full link 

好消息,雖然:我在Visual Studio 2015中做了一個快速測試,增量鏈接似乎按預期工作。

來源:大量的實驗和環顧四周,有同樣的問題。另外,這個:http://www.pcreview.co.uk/threads/incremental-linking-and-multiple-projects.1431266/,具體地:

這是設計。當靜態庫更改時,我們無法逐步鏈接。 之前從未支持過。

羅納德Laeremans時,Visual C++團隊

編輯 - 這證實了2015年VS使用靜態庫時,有增量鏈接:http://blogs.msdn.com/b/vcblog/archive/2014/11/12/speeding-up-the-incremental-developer-scenario-with-visual-studio-2015.aspx