2012-05-29 47 views
4

我有一個巨大的C + + 11項目插件功能。我的項目有幾個庫(用gcc 4.6.3編譯),一個前端(用gcc 4.6.3編譯)和一些插件(用gcc 4.7編譯)。插件通過dlopen加載並從libs中引用。GCC 4.7編譯庫與GCC 4.6.3程序兼容嗎?

我的項目使用模板,typeinfo,shared_ptr,stl容器等東西。

當我編譯與gcc相同版本的所有東西時,一切都運行正常。當我按照我描述的方式編譯時(4.6.3中的libs和frontend和4.7中的插件),我開始面臨問題。

我不確定發生了什麼,我希望你能給我一些線索並幫我解決這個問題。

+4

「*當我編譯所有與相同版本的GCC一切運行正常。我編譯時描述(庫和前端在4.6.3的方式和插件4.7)我開始面臨問題*「聽起來像你已經回答了你自己的問題,然後... – ildjarn

回答

4

G ++ 4.6 兼容4.7,儘管人們在這裏聲稱,只要在運行時使用libstdC++。因此從用於構建任何對象的最新版本開始。

但是對於C++ 11來說,由於支持仍在不斷髮展(直到最近C++ 11也是如此),所以我們一直無法避免做出一些不兼容的更改,以便改進C + +11支持。

對於您的問題,一個更完整的答案後細節到GCC-幫助郵件列表,我會考慮它

+1

我想孤立的問題,但我還沒有設法做到這一點。 –

+0

要清楚:如果將庫和可執行文件靜態鏈接到不同版本的libstdC++,它將無法正常工作? – KillianDS

+0

它可能會取決於它們之間傳遞的是哪些類型,以及這些類型是否在版本之間更改。對於任何C++ 03或應該工作正常,對於C++ 11它依賴。 OP是否靜態鏈接? –

4

http://gcc.gnu.org/gcc-4.7/changes.html

版本的GCC 4.7.0和4.7.1已經改變了C++標準庫,它影響了C++ 11模式下的ABI:一個數據成員被添加到std :: list中,改變了它的大小並改變了一些成員函數的定義,而std :: pair的移動構造函數是non-它改變了std :: pair參數或返回類型的調用約定。對於GCC 4.7.2版本,ABI不兼容性已得到修復,但因此使用GCC 4.7.0或4.7.1編譯的C++ 11代碼可能與使用不同GCC版本和C++編譯的C++ 11代碼不兼容98/C++ 03代碼與任何版本編譯。

我有性病::名單問題<>