2017-08-03 63 views
-1

從Visual Studio 2010到2015最近更新了一個項目,我們遇到了一個奇怪的鏈接時問題。Visual C部隊未使用的導入,由圖書館拉入

我們爲amd64和x86以及調試和發佈模式構建我們的項目。 該項目有2個依賴項,我們稱之爲libAlibB。 我們有一些自定義的構建後腳本,對二進制文件進行一些驗證(例如檢查NX和SEH標誌等)。 使用此腳本,我們還驗證導入的DLL及其導入的函數,以儘可能少地保持靜態導入,並嘗試通過動態加載(爲了向後兼容)來解決額外的問題。

遷移後,我們設法建立在每一個可能配置的一切,但在DEBUG模式(在僅調試模式)生成的二進制文件 - 由於在存在代碼力霸 - 拉在一些進口 - 讓我們將其稱爲dllA - 實際上未使用,因此不希望存在。 libB引入沒有問題 - 雖然它是一個非常簡單的庫。

爲什麼力霸在是因爲它是一個多用途庫,通過一些其他項目使用,它有一些代碼,從調用函數DLLA拉動這些進口,但在我們的項目我們之所以根本不要調用那些dllA-export-calling-functions。 我也用IDA反彙編了dll,發現這些函數都在二進制文件中,與二進制代碼中的其餘代碼完全斷開 - 它們根本沒有被引用。

經過一番摸索,並試圖將RELEASE版本力霸的鏈接到我們的DEBUG建立我們的項目,我發現,從DLLA進口不再被拉入,使得我想,圖書館配置可能是問題。 我使用了庫的調試和發佈版本的命令行參數,並且將它們並排比較,以找出配置的差異。 我對針點管理的問題,以優化設置(優化選項卡上):

  • 調試模式,它在默認情況下
  • 設置爲Disabled(/OD)的發佈模式,它是設定爲最大速度(/O2
  • 設置最大化速度(/ O2)DEBUG模式需要照顧的問題 - DLLA不再進口

我的問題是,這對於調試是非常直觀的,因爲編譯器會優化太多的東西,可能會使調試更加困難。

發佈之前,我環顧四周隨處可見,還研究了在我們的主要項目的連接器 - >優化頁面,而參考選項設置爲是(/ OPT:REF),應避免鏈接未使用的代碼,但在我看來,VS2015在調試版本中完全忽略了這個設置。

+0

重複評論 – user2281752

回答