GNU/Linux >> Linux の 問題 >  >> Linux

Clang は GCC でコンパイルされた .a ライブラリでコードをコンパイルできますか?

少なくとも 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 は非互換に進化しました。


Linux
  1. gcc/cmake を使用して 64 ビット Linux マシンで 32 ビット バイナリをコンパイルする方法

  2. LinuxでC++ IDEに苦労しています

  3. 行番号情報を含む gcc を使用して C++ のスタック トレースを取得するにはどうすればよいですか?

  1. GCC を使用した C/C++:リソース ファイルを実行可能ファイル/ライブラリに静的に追加する

  2. 私のブートローダーは gcc 4.6 と 4.7 でコンパイルできません ... 4.5 のみ

  3. Linuxで共有ライブラリを別の共有ライブラリとリンクする

  1. C++ アプリケーションが 143 終了コードで終了する - どういう意味ですか?

  2. Linux で Windows Visual C++ コードをコンパイルする方法

  3. Android - root 化された電話でネイティブ アプリケーションをコンパイルするにはどうすればよいですか?