2017-05-31 238 views
0

This SO post: Is Visual-C++-2017 binary compatible with VC++-2015?很明顯地說VS 2016與VS 2015是二進制兼容的,它甚至看起來像官方位置。VS2017和VS2015之間的二進制兼容性

我的問題是,在過去,我清楚地記得運行到鏈接器錯誤(我不記得具體的一組錯誤),每次我試圖鏈接在一個靜態庫編譯了不同版本的MSVC轉換爲使用MSVC的新版本構建的EXE。

然而,二進制(in)的兼容性聽起來像是在你的臉上炸開運行時,而不是鏈接時間。

有人能告訴我,如果以前版本的MSVC在版本不匹配時確實生產鏈接器錯誤?這是如何完成的?

編輯

這將如何影響與WPO/LTCG內置靜態庫是否已開啓?我相信這些產生中間目標文件(而不是COFF),而且Microsoft不保證這些中間文件的格式在不同版本的編譯器中保持停滯。

+0

https://msdn.microsoft.com/en-us/library/ee956429.aspx –

+0

@HansPassant對不起,我不明白。你說的是用VS2013構建的靜態庫,會自動放置一個pragma_detect指令,但是如果我試圖從不同的編譯器鏈接到它,鏈接器錯誤會顯示出來嗎? (即沒有我介入?) – ForeverLearning

+1

「自動」不完全是正確的詞。此#pragma出現在您在程序中使用的#include文件中。這是一個通用機制,編譯器的包含文件只是利用它來檢測嚴重不匹配。它將/ FAILIFMISMATCH「foo = bar」鏈接器指令嵌入到目標文件中,鏈接器僅收集所有的foos並驗證它們是否都是條形碼。只需grep在#pragma的vc/include目錄中的文件就可以看到它們正在被使用。 –

回答

2

正如我回答了鏈接的問題,V140 VS 2015中的工具集和VS 2017中的v141工具集是二進制兼容的。 v141被建立爲同一個「家族」的成員,因爲v140的所有更新(例如,VS 2015 Update 1,2,3)都在同一個家族中。這是一個有意的設計決定,可幫助開發人員轉向新版本的VS,而不必擔心必須對其源代碼進行更改。

VS 2017可以支持多種工具集。下一個工具集不會與v140/v141二進制兼容。但是,當您將代碼移動到與下一個工具集中的新C++功能兼容時,您仍然可以安裝v141。

請注意,我們從來沒有支持跨主要版本的二進制兼容性。無論使用WPO/LTCG /等,您都無法鏈接使用v140構建的二進制文件和使用v130構建的二進制文件。是的,它經常起作用 - 我們試圖最大限度地減少我們的庫中的重大更改,因此經常會發生這樣的情況,即在主要版本之間鏈接某些代碼不會產生任何錯誤。但最終你會遇到一些變化,你會看到一個錯誤。

至於您是否看到鏈接錯誤或運行時錯誤,取決於您調用的不兼容庫API。如果導出的API形狀發生變化 - 函數名稱,參數數量 - 則鏈接器將無法找到它。如果形狀相同但行爲已更改,則可能會導致運行時失敗。

--Andrew帕多,MSVC工具

+0

謝謝安德魯。 WPO/LTCG問題背後的一點是,我不確定二進制兼容性是否處理中間目標文件格式。由於IIUC除了二進制兼容以外,WPO/LTCG的問題是目標文件格式因工具鏈而異。 – ForeverLearning

+0

是的,正如我所說:你可能能夠跨發佈版本鏈接一些代碼,但最終你會遇到一些破壞。 – apardoe

+0

v141和v140_xp怎麼樣?我正在將一個v140_xp項目轉換爲v141,並且突然發生由asp.net dll導致的崩潰,該崩潰並沒有特定的版本工具集,據我所知 –