web-dev-qa-db-ja.com

std :: __ cxx11 :: stringからstd :: stringへの変換

私はc ++ 11を使用しますが、C++ 11用に構成されていないいくつかのライブラリも使用しており、何らかの型変換が必要です。特に、std::__cxx11::stringを通常のstd::stringに変換する方法が必要ですが、グーグルでこれを行う方法が見つからず、(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'
63
jorgen

GCC 5を使用している可能性はありますか?

Std :: __ cxx11名前空間またはタグ[abi:cxx11]の型に関連するシンボルへの未定義の参照に関するリンカーエラーが発生した場合、おそらく、_GLIBCXX_USE_CXX11_ABIの異なる値でコンパイルされたオブジェクトファイルをリンクしようとしていることを示していますマクロ。これは、GCCの古いバージョンでコンパイルされたサードパーティライブラリにリンクするときによく発生します。サードパーティのライブラリを新しいABIで再構築できない場合は、古いABIでコードを再コンパイルする必要があります。

出典: GCC 5リリースノート/デュアルABI

標準ライブラリヘッダーを含む次のマクロbeforeを定義すると、問題が解決するはずです:#define _GLIBCXX_USE_CXX11_ABI 0

83

使用する互換性のないライブラリをすべて再コンパイルできる場合は、コンパイラオプションを使用して実行してください。

-D_GLIBCXX_USE_CXX11_ABI = 1

その後、プロジェクトを再構築します。それができない場合は、プロジェクトのmakefileコンパイラオプションに追加します

-D_GLIBCXX_USE_CXX11_ABI = 0

定義する

#define _GLIBCXX_USE_CXX11_ABI 0/1

も良いですが、おそらくすべてのファイルに追加する必要がありますが、コンパイラオプションはすべてのファイルに対して一度にそれを行います。

46
Denis Sirotkin

私にとっては-D_GLIBCXX_USE_CXX11_ABI = 0は役に立ちませんでした。

GnustlではなくC++ libsバージョンにリンクした後に動作します。

0
dimon4eg

これを入手しました。これを修正する唯一の方法は、mingw-64をすべて更新することです(情報としてmsys2のpacmanを使用しました)。

0
ceorron