ホームページ >バックエンド開発 >C++ >ライブラリをリンクする際の `std::__cxx11::string` と `std::string` の非互換性の問題を解決するにはどうすればよいですか?

ライブラリをリンクする際の `std::__cxx11::string` と `std::string` の非互換性の問題を解決するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-19 00:39:10520ブラウズ

How to Resolve `std::__cxx11::string` and `std::string` Incompatibility Issues When Linking Libraries?

__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&amp;, unsigned long, H5::DataType const&amp;) 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 サイトの他の関連記事を参照してください。

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