2015-11-27 29 views
13

我有一個應用程序,其中包含用作插件編寫器的C++接口的一部分的STL對象。共享庫與其接口中的STL對象的GCC兼容性

我知道兼容性的最佳選擇是使用C接口,但目前不可行。

我知道在libstdC++中從GCC 3.4到4.8的所有內容在ABI方面都是高度兼容的。例如,如果我使用GCC 4.1進行編譯,並且插件供應商編寫使用GCC 4.7編譯的代碼,那麼除非出現轉角情況,否則所有將在符合GCC 4.7或更高版本的libstdC++版本的平臺上運行良好, 提供的STL使用僅限於.so內部,並且外部.so界面使用純C,但遺憾的是我不是這種情況。

所以,我很好奇關於用作插件接口一部分的STL類的情況。我可以安全地在未使用相同編譯器版本(例如4.1和4.8)編譯的共享對象之間傳遞STL對象嗎?如果人們使用不同的編譯器選項,有什麼需要注意的是如何編譯和解決模板問題?

我懷疑它會有問題。但是,GCC人員可能會以某種方式完成這項工作,因此可能會出現符號版本化魔法。

對於這個問題,我只對Pre-C++ 11編譯和鏈接感興趣。我也只對使用GCC的Linux和Mac OS X感興趣。

+1

除非人們不想讓自己失敗,否則它應該工作得很好。 –

+0

@marc感謝您的反饋。任何機會,你可以提供一個參考或鏈接進入這個更詳細一點(或者可能是依賴於此的項目)? – Rob

+1

雖然它不一定適用於gcc> = 5.0,因爲它們[改變了它們的ABI](https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html) – Walter

回答

7

我已經在mailing list上回答了這個問題,但正如馬克所說,這隻會起作用。

無論您在DSO內部使用庫還是在界面中使用庫都沒有任何區別,庫無論如何都不關心,並且向後兼容GCC 3.4。

+0

非常感謝您的答案!我會接受它,因爲你是libstdC++的權威人士。 正如在郵件列表中提到的那樣,如果有任何文檔可以指出我如何實現持續高度的ABI兼容性(例如,確保內存佈局保持一致,內聯保持一致等),那麼我會很感激。 – Rob

+0

@Jonathan Wakely如果你得到一個場景,在lib中完成new/malloc,指針以某種方式傳播到用戶的應用程序並在那裏完成刪除/釋放操作?我已經看到在同一應用程序中有多個libc版本和多個內存分配程序的情況,並且上述情況可能導致應用程序崩潰。 –

+0

@ErikAlapää,有多個libc是你的問題,而不是libstdC++的問題。該標準說分配函數是全局的,如果你違反了一個定義規則有多個不兼容的分配函數,那麼你需要自己處理它。 –