一千萬個為什麽

搜索

我可以在Visual Studio 2008中使用Visual Studio 6編譯的C ++靜態庫嗎?

是否可以使用在Visual Studio 2008中使用Visual Studio 6編譯的C ++靜態庫(.lib)?

最佳答案

這真的取決於。這個庫是否僅暴露'extern“C函數,其中內存是由直接的Win32方法(CoTaskMemAlloc等)管理的,或者調用者從不釋放被調用者分配的內存,反之亦然?你只依賴基本庫,自VS 6以來沒有多大改變?如果是這樣,你應該沒問題。

有兩件基本的事情需要註意。對第三方庫使用的全局變量的更改,以及由這些第三方庫定義的結構,類等的結構更改。例如,CRT內存分配器可能在兩個版本之間更改了它的隱藏分配管理結構,因此只有一個版本的庫分配了一塊內存,並有另一個釋放它可能會導致崩潰。

再舉個例子,如果你通過接口公開C ++類並且他們依賴於MFC運行時庫,那麽VS6和VS2008之間的類布局有可能發生變化。這意味著訪問類中的成員/字段可能會去做錯事,導致不可預知的結果。如果.lib以任何身份使用MFC,則可能會受到影響。 MFC定義並在內部使用了大量的全局變量,並且如果MFC基礎架構在主機環境中發生更改(自VS 6,BTW以來它發生了很大變化),那麽通過.lib中的操作對MFC全局變量的任何訪問都可能導致失敗。

我還沒有探究在MFC頭文件中做了什麽修改,但是我看到了在不同的VS版本中編譯的基於MFC/ATL的類二進制文件之間的不可預知的行為。

除了這些問題之外,像strtok()這樣的函數存在依賴於運行時庫中定義的靜態全局變量的風險。我不確定,但我擔心如果您使用期望在多線程CRT上創建的線程上的單線程CRT的客戶端,那些靜態變量可能無法正確初始化。查看_beginthread()的文檔獲取更多信息。

轉載註明原文: 我可以在Visual Studio 2008中使用Visual Studio 6編譯的C ++靜態庫嗎?