2013-04-24 19 views
14

我有幾個靜態庫,我不是所有者,用舊版本的g ++(4.3.2,C++ 11/C++ 0x not activated)編譯。當我用g ++ 4.6(no C++ 11)編譯我的代碼並將它與這些 靜態庫鏈接(使用g ++ 4.6)時,它鏈接正常,我似乎沒有在運行時遇到任何問題(未經測試一切儘管)。 所以我很想去考慮向前兼容性。g ++總是向後兼容「舊」靜態庫?

現在我想用C++ 11編譯我的代碼,並將它與那些相同的鏈接,而不是重新編譯靜態庫。威爾仍然工作?

換句話說, ABI在g ++中的變化只是一個連接向前兼容性的問題,或者也可以得到向後兼容性問題嗎?

謝謝。

回答

22

的G ++ ABI的C++ 98的代碼是向後兼容的,回GCC 3.4

一路所以,如果你編譯和GCC 4.8鏈接最終可執行您可以鏈接到與任何內置對象和庫從GCC 3.4到4.8(但不是更新)

C++ 11 ABI與C++ 98 ABI相同,並且C++ 98和C++ 11共有的標準庫類型具有相同的定義,(忽略GCC 4.7.0和GCC 4.7.1,在使用C++ 11時在std::pairstd::list中有ABI不兼容,在4.7.2及更高版本中已經修復) so you ca n連接C++ 98和C++ 11一起代碼(除非C++ 11代碼用GCC 4.7.0或4.7.1內置)

然而一些C++ 11庫類型是目前還不穩定,在版本之間變化,例如因爲它們是在最終的C++ 11標準之前首次發佈的,必須進行更改以符合最終規則。因此,將使用GCC 4.6和C++ 11代碼構建的C++ 11代碼與使用GCC 4.8構建的代碼混合並不一定安全。對於您的情況,所有C++ 11代碼都使用GCC 4.8構建,好。如果你升級編譯器,你應該用新的GCC重建所有的C++ 11代碼以保證安全。 (你不需要重建C++ 98/C++ 03代碼)

+0

完美謝謝! (我會upvote你,但我不允許,但似乎) – 2013-04-24 17:38:57

+0

N.B.我剛剛添加的最後兩段,我最初應該已經說清楚了,但是很忙,很抱歉 – 2013-04-24 22:16:59

+0

謝謝你的精度,Jonathan(哦,對,**來自ACCU 2013的** Johathan!解釋質量的答案:) – 2013-04-25 09:19:40

0

與編譯器供應商一樣,C++ 11標準的目標是維護向後兼容性。只要圖書館沒有使用任何「中斷」C++ 11標準,圖書館格式本身應該是相同的。

有關在C++ 11中引入的更改,請參閱this

因此,假設你用來調用庫的代碼(包括頭文件),你應該沒問題。