C 0x モードで libc を使用した Clang が Boost::program_options サンプルのリンクに失敗するのはなぜですか?

DDD
リリース: 2024-11-02 15:21:30
オリジナル
678 人が閲覧しました

Why does Clang with libc   in C  0x mode fail to link Boost::program_options examples?

この boost::program_options の例をリンクする c 0x モードで libc を使用すると鳴らないのはなぜですか?

背景:

Clang の C 0x モードと libc を使用して Boost::program_options の例をコンパイルしてリンクしようとすると、次のエラーが発生します:

Undefined symbols for architecture x86_64:
  // Various undefined symbols related to Boost::program_options
ログイン後にコピー

説明:

このエラーの主な理由は、 libc が GCC の libstdc とバイナリ互換性がないことです。具体的には:

  • libstdc では、 std::string は参照カウントされます。
  • libc では、 std::string は異なるメモリを持つ「短い文字列最適化」(SSO) を使用します。レイアウトと動作。

解決策:

この問題を解決するには、libc を標準ライブラリとして Clang を使用して Boost を再構築する必要があります:

clang++ -stdlib=libc++ ...
ログイン後にコピー

バイナリ非互換性の理由:

バイナリ非互換性による偶発的な混合や実行時のクラッシュを防ぐために、libc は C 11 のインライン名前空間機能を利用して、C11 の ABI (アプリケーション バイナリ インターフェイス) を変更します。同じ API (アプリケーション プログラミング インターフェイス) を維持しながら std::string を作成します。これにより、リンカーは libstdc の std::string と libc の std::string を確実に区別できるようになります。

以上がC 0x モードで libc を使用した Clang が Boost::program_options サンプルのリンクに失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!