__cxx11::string から std::string への変換: 互換性のないライブラリの処理ガイド
std::__cxx11 間に非互換性が発生しました: :string 型と通常の std::string はイライラする問題になる可能性があります。 C 11 用に構成されていない可能性のあるライブラリとインターフェイスしようとすると、これらのタイプ間で変換する必要が生じます。ただし、(string) を使用して std::__cxx11::string を std::string にキャストしようとするだけでは十分ではありません。
この問題は、次のようなリンカー エラーとして現れることがよくあります。
undefined reference to `H5::CompType::insertMember(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long, H5::DataType const&) const'
腹痛の理解:
考えられることの 1 つこの非互換性の原因は、GCC 5 の使用にあります。GCC 5 では、C 標準ライブラリにデュアル ABI が導入されており、一方の ABI でコンパイルされたコードは、もう一方の ABI でコンパイルされたコードとリンクできません。コードで新しい ABI が使用されているのに、サードパーティのライブラリが古い ABI でコンパイルされている場合、リンクの問題が発生する可能性があります。
解決策:
この問題を解決するには、標準ライブラリ ヘッダーを含める前に、マクロ _GLIBCXX_USE_CXX11_ABI を 0 に定義します。これにより、GCC は古い ABI を使用するようになり、サードパーティ ライブラリとの互換性が確保されます。
#define _GLIBCXX_USE_CXX11_ABI 0 #include <iostream> #include <string>
このマクロを定義すると、リンカーはシンボルと std::__cxx11 からの変換を正常に解決できるはずです。 ::string から std::string はエラーなしで続行されるはずです。
以上がライブラリをリンクする際の `std::__cxx11::string` と `std::string` の非互換性の問題を解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。