2016-06-27 61 views
5

我有以下情況:用GCC混合不同的C++標準

有兩個組件,一個是用C++ 11編寫的,另一個是用C++ 98編寫的。 兩者都使用相同的GCC 4.9從頭開始編譯。一個使用隱式默認--std=gnu++98另一個明確設置--std=c++11

即使做了一些研究,我也無法完全回答這個問題,如果這可能會導致問題。

GCC wiki說:

的C++語言98 ABI是兼容的C++語言的11,但在圖書館休息兼容性好幾個地方。這使得將C++ 98對象與C++ 11對象鏈接起來非常危險。如果您可以使用該語言的匹配版本重新編譯代碼,則應該這樣做。

這表明問題是可以預料的。

所以問題是:

  1. 有沒有,如果有--std=gnu++98--std=c++11建造的兩個部件連接在一起的問題,甚至是艱難的,他們使用相同的libstdc++和相同的編譯器(GCC 4.9)都建?

  2. 請問Dual ABI支持形式GCC 5.1在這種情況下有影響嗎?

+0

我建議只用'-std = C++ 11'(或GNU方言)構建。 –

+0

這將是理想的,但在這種情況下,第一個組件的編譯無法在使用C++ 98更新的情況下編譯時進行編譯,並且現在無法進行更改。 – Pascal

+0

使用'std :: string'?其次,那些打破變化的人,也許你應該對他們感到害怕:許多「休息」可能是實際的錯誤。 – Yakk

回答

0

1)例如,您提到的lib的某些部分的實現更改可能會有問題。

2)是的。

我會重新編譯兩個C++版本中的一個。如果這不是一個選擇(第三方庫等)使用雙重ABI機制可能是一個解決方案。要非常小心它在不同版本的代碼之間共享的內容。

您提到的wiki的部分內容涉及例如舊代碼嘗試執行不再支持的內容(語義不同但語法相同)的情況。

+0

關於答案1)你的意思是,問題是'libstdC++'的界面在C++ 98和C++ 11之間改變了。還是僅僅因爲它們可能會略有不同而出現錯誤?在第二種情況下,如果代碼根據C++標準正確無誤,這不應該發生? – Pascal

+0

兩者。由於您使用GCC 4.9,因此您可能不會遇到任何此類問題(您將使用libstdC++的舊實現),但您必須注意的是其他不同庫,您不知道依賴關係。在libstdC++中,你很幸運,因爲這些更改是與命名空間一起內聯的,如果有這種問題,鏈接器會警告你。這可能會或可能不會發生與其他圖書館(例如助推器存在在這種情況下痛苦的高風險)。 – Robbykk