ホームページ  >  記事  >  バックエンド開発  >  C 0x モードで libc を使用した Clang が Boost::program_options サンプルのリンクに失敗するのはなぜですか?

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

DDD
DDDオリジナル
2024-11-02 15:21:30680ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。