C 0x モードで libc を使用した Clang が Boost::Program_Options のリンクに失敗する理由
指定されたスニペットは、コンパイルしようとしたときに問題が発生することを示しています
問題分析
コンパイル エラーは、 libc とデフォルトの標準である libstdc 間の非互換性に起因します。 g によって実装されたライブラリ。 libc は std::string に異なる実装詳細を採用しており、 libstdc とは ABI (アプリケーション バイナリ インターフェイス) の違いが導入されています。
解決策
この問題を解決するには、次のことが必要です。 -stdlib=libc フラグを指定した Clang を使用して Boost を再構築します。これにより、実行可能ファイルがリンクされているのと同じ標準ライブラリに対して Boost ライブラリがコンパイルされるようになります。これは、Boost ライブラリとコンパイルされるプログラム全体で std::string の ABI を調和させます。
技術的な説明
libc は、インライン名前空間を利用して std の ABI を変更します。 :string の API を変更せずに。これにより、2 つのライブラリ間に認識上の不一致が生じます。libstdc の std::string と libc の std::__1::string は、リンカーによって別個のデータ構造として扱われます。
適切な標準で Boost を再構築することによってライブラリでは、boost::program_options のシンボル定義がリンカーによって予期されるものと一致し、リンクが成功します。
以上がC 0x モードで libc を使用した Clang が Boost::Program_Options のリンクに失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。