2012-01-18 72 views
1

我們的項目使用VC++ 9與VS2008,我們希望使用VS2010切換到VC++ 10以使用新功能。不幸的是,我們的一些依賴關係是用VC++ 9構建的,並且出於各種原因目前不可能用VC++ 10重新編譯它們。既然我們真的想要切換,是否有一種方法可以簡單地與這些庫鏈接,或者VC++ 10和VC++ 9二進制文件之間沒有兼容性?將使用VC++ 10編譯的代碼鏈接到使用VC++編譯的代碼9

編輯:實際的依賴關係是BWAPIBWTA。在BWAPI的情況下,這不是問題,但BWTA取決於CGAL,這就是給我們帶來麻煩的原因。試圖鏈接它會產生一堆鏈接錯誤。

+0

實際嘗試並告訴我們發生了什麼問題後,回答起來要容易得多。這不是不可能的,但撥打電話需要您提供更多信息。 – 2012-01-18 18:24:05

回答

1

一般而言,除非依賴項是COM模塊或只導出「純」C函數的dll,否則運氣不佳。

1

允許Visual Studio版本打破ABI兼容性。這意味着C++類的導出和內部簽名是不同的,並且將例如std::string從用一個版本編譯的二進制文件傳遞到用不同版本編譯的二進制文件可能沒有預期的結果。總之:不要依賴這個工作。如果確實如此,那麼你很幸運,但是在運行時級別的「未定義行爲」領域。只需修復您的代碼即可使用VS2010進行構建。這可能是壞的開始。

+0

這不是我們的代碼。事實上,我們的代碼構建得很好。問題是我們正在使用一些外部庫。 – 2012-01-18 21:12:28

0

很好在第三方庫的情況下,你不能改變,典型的答案是用VC2008構建的簡單的DLL包裝它們,併爲你調用第三方。然後,您可以控制所暴露的內容,這樣您就可以回到與兩個鏈接器一起工作的「標準化」機制。這幾乎總是C函數調用,因爲C非常標準化。

問題是MS改變了編譯C++的ABI,我猜測標準委員會沒有提供調用C++二進制文件的標準方法。

看着GCAL這似乎不是一個很好的答案,在這種情況下你可以做的最好的辦法是聯繫GCAL並等待重建的二進制文件。


但我只是檢查 - 它開源,自己重建。不僅如此,它已經支持VS2010,所以重建應該很容易。