ご覧のとおり、インライン名前空間を使用して ABI のバージョン管理を実現しています。
それが意味すること:
libstdc++std::string
は libc++ とは異なるデータ構造ですstd::string
。前者は参照カウント設計ですが、後者はそうではありません。API 互換性はありますが、ABI 互換性はありません。つまりstd::string
、 libstdc++ を使用して を構築し、それを libc++ に対してリンクされている他のコードに渡すと、受信側のコードは libc++ があると見なしますstd::string
。つまり、受信者は、参照カウントをインクリメントまたはデクリメントする必要があるという手掛かりを持っていません。
インライン名前空間がないと、実行時エラーが発生します。あなたが望むことができる最善のことはクラッシュです。インライン名前空間では、この実行時エラーはリンク時エラーに変換されます。
プログラマにとって、libstdc++std::string
と libc++std::string
は同じ型のように見えます。しかし、リンカーにとっては、それらはまったく異なる型のように見えます (手がかりはstd::__1
名前空間です)。そしてリンカーの見解は正しいです。それらは完全に異なるタイプです。
そうです、いくつかのプリプロセッサ フラグを操作して、リンクさせることができます。しかし、結果として生じる実行時のバグをデバッグするのは大変なことです。
あなたがしたいことをする唯一の方法は、これらの dylib 間のインターフェースstd::
にstring
. たとえば、char
代わりに の配列を渡すことができます。libstdc++ にリンクされたコードから libc++ にリンクされたコードにメモリの所有権を転送することもできます (両方とも同じ malloc プールにドロップされます)。