2015-11-27 16 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で回答しましたが、Marcは言ったように、うまくいくでしょう。

ライブラリをDSOまたはインターフェイスに内部的に使用するかどうかは関係ありません。ライブラリは気にせず、どちらの方法でもGCC 3.4と下位互換性があります。

+0

答えに多くの感謝!あなたがlibstdC++の権威であるので、私はそれを受け入れます。 メーリングリストに記載されているように、ABI互換性の一貫性をどのように達成したかについて私に指摘することができます(メモリレイアウトの一貫性、インライン化の一貫性などを確認するなど)私はそれを感謝します。 – Rob

+0

@Jonathan Wakely新しい/ mallocがlibの中で実行されるシナリオを得ると、何とかポインタがユーザのアプリケーションに伝播して削除/フリーがそこで行われますか?私は同じアプリケーションに複数のlibcバージョンと複数のメモリアロケータがあるシナリオを見てきました。そして、上記のシナリオはアプリケーションをクラッシュさせる可能性があります。 –

+0

@ErikAlapää、libstdC++の問題ではなく、複数のlibcを持つことが問題です。標準では、複数の互換性のない割り当て関数を持つことによってOne Definition Ruleに違反した場合、それを自分で処理する必要がある場合、割り当て関数はグローバルであると言います。 –

関連する問題