Visual Studio 2017 如何編譯 Visual Studio 2015 的項目?

有一個項目使用了第三方庫,然而這些庫的無法和 Visual Studio 2017 編譯的目標文件鏈接(因為是用 Visual Studio 2015 編譯的),唯一的解決方法是使用 VS 2015 構建嗎?


裝2015 standalone工具鏈和相應的運行時和庫,然後用2017打開項目,不選擇升級解決方案就行了


2017裝的時候可以選vc140的工具鏈,之後在項目里選上就行了。兩個地方要注意,一個是WinSDK版本要一致,另一個是工具鏈要一致。

當然,最好的方法還是都找到源代碼,用2017/vc141編譯。


不同Toolset可能會採用不同的ABI,所以不建議混用。

然而,就visual studio 20150和2017的toolset來說,混用並不影響你的編譯鏈接,因為微軟個坑比讓他們兼容了。

vs2015的toolset編譯好的庫,無論是靜態庫還是動態庫,都可以被使用vs2017 toolset的項目信用並且正常編譯鏈接,因為他們是ABI兼容的。

只要保證運行時匹配就行了。

上周我們老大(一個微軟出來的俄羅斯胖老頭)讓我把公司所有CPP項目全部升級VS2017 的toolset,因為我們要精簡Buils agent機器上的vs簡單說就是刪除2015toolset。我說這麼一來我們所有依賴的第三方庫都要自己編譯啊,boost,cpprest,openssl什麼鬼的一大堆啊。

老頭說:為什麼?

我說:因為ABI不兼容啊。

老頭說:你確定?我跟你打賭一頓飯,你自己做個小Demo看看行不行。

我說:賭就賭,這踏馬以前解決過的問題還需要懷疑自己么?

然後我就開始寫了個小DEMO用vs2017的toolset引用vs2015的toolset編譯的cpprest,結果踏馬的編譯成功了…

我不服啊,微軟坑比啊,怎麼回事啊,我就去找微軟,微軟說:

except for 2015 and 2017, which are binary compatible

C++ does not have a stable application binary interface (ABI). Visual C++ maintains a stable ABI for all minor versions of a release. For example, Visual Studio 2017 and all its updates are binary compatible. But the ABI is not necessarily compatible across major versions of Visual C++ (except for 2015 and 2017, which are binary compatible). That is, we may make breaking changes to C++ type layout, name decoration, exception handling, and other parts of the C++ ABI. Thus, if you have an object file that has external symbols with C++ linkage, that object file may not link correctly with object files produced with a different major version of the Visual C++ toolset. Note that here, 「may not work」 has many possible outcomes: the link may fail entirely (e.g. if name decoration changed), the link may succeed and things may not work at runtime (e.g. if type layout changed), or things may happen to work in many cases and nothing will go wrong. Note also that while the C++ ABI is not stable, the C ABI and the subset of the C++ ABI required for COM are stable.

Overview of potential upgrade issues (Visual C++)

微軟欠我一頓飯

補充一點,題主的問題無法鏈接肯定是因為你的運行時或者其他某些編譯選項沒有配置正確。


裝的時候可以選啊。選上後點開解決方案不就直接2015嗎?


推薦閱讀:

如何卸載vs2015?
用什麼技術開發一個無依賴的windows桌面開發最為高效?
Visual Studio 是不是坑了一代人?為什麼?
Visual Studio 為什麼不提供整體卸載功能?
Visual Studio Community 2013在編譯和運行時與Visual Studio Professional 2013有什麼區別?

TAG:MicrosoftVisualStudio | MicrosoftVisualStudio2015 |