少なくとも Crypto++ ライブラリでは、これは機能しません (検証済み :-( )。したがって、C++ コードでは機能する可能性は低くなりますが、純粋な C コードはおそらく問題なくリンクします。
編集:Mac OS X 10.9 Mavericks と Xcode-5 で問題が発生し始めました。これにより、clang のデフォルトの C++ ライブラリが libstdc++ から libc++ に切り替わりました。 Mac OS X 10.8 以前には存在しませんでした。
C++ コードを clang でコンパイルし、gcc でコンパイルされたライブラリにリンクする必要がある場合は、「clang++ -stdlib=libstdc++」を使用してください。リンクは成功し、結果のバイナリは正しく実行されます。
注意:他の方法では動作しないようです:"clang++ -stdlib=libstdc++" でコンパイルされたライブラリをビルドし、gcc でコンパイルされたコードをリンクすることはできますが、このコードは SEGV でクラッシュします。これまでのところ、clang でコンパイルされたライブラリとリンクする唯一の方法は、gcc ではなく、clang でコードをコンパイルすることだとわかりました。
EDIT2 :GCC-12 には -stdlib=
が含まれているようです 国旗。 g++ -stdlib=libc++
でコンパイルする Clang++
を作成します -互換性のあるオブジェクト ファイル。とてもいいですね。
はい、あなたはいつも clang
を使用できます GCC コンパイル済みライブラリ (およびその逆、gcc
を使用) 実際には、関連するのはコンパイルではなくリンクであるためです。運が悪く、不愉快な驚きを受けるかもしれません.
原則として、libstdc++
のバージョンに依存する可能性があります。 関連するライブラリをリンクするために使用されます (C++ でコーディングされている場合)。実際には、それは通常あまり問題ではありません。
C++ では、理論的には名前マングリングが問題になる可能性があります (いくつかのまれなケースがあり、g++
の 2 つの異なるバージョン間で互換性がないことさえあります) )。繰り返しますが、実際には通常は問題になりません。
したがって、通常、CLANG (異なるが近いバージョンであっても) を GCC と混在させることができますが、不愉快な驚きがあるかもしれません。 C++ コンパイラ (CLANG であれ GCC であれ) に期待されることは、同じコンパイラとバージョンを使用して、ソフトウェア全体 (およびすべてのライブラリ) を一緒にコンパイルおよびリンクできることです。 (そして、同じ C++ 標準ライブラリ 実装 が含まれています )。これが、ディストリビューション内のコンパイラのアップグレードが大変な作業である理由です。ディストリビューション メーカーは、すべてのパッケージが適切にコンパイルされることを確認する必要があります (そして、彼らは驚きます!)。
libstdc++ のバージョンが重要であることに注意してください。 Clang と GCC の両方のコミュニティは、コンパイラのアップグレードのために ABI の互換性を確保するために懸命に取り組んでいますが、微妙なケースもあります。特定の特定の C++ 標準ライブラリ実装のドキュメントを読んでください。 GCC 8 でコンパイルされたコードで (GCC 5 でコンパイルされた) 適切な C++ ライブラリ バイナリを使用すると、これらのまれなケースで不可解なクラッシュが発生する可能性があります。バグはライブラリにはありませんが、ABI は非互換に進化しました。