2015-10-28 40 views
42

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

エラーは、コンパイラが 'insertMember()'メソッドを見つけることができないように聞こえます。 –

+1

ええと、それは私が 'C++ 11'を使わない他のプログラムと一緒に見つけることができます – jorgen

+0

実際には、コンパイラではなくリンカのようです。 「見つける」とは何か、「他のプログラム」は何か? –

答えて

57

を、それはあなたがGCC 5を使用していることは可能ですか?

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

出典:GCC 5 Release Notes/Dual ABI

の定義次のマクロあなたの問題を解決する必要がある任意の標準ライブラリヘッダを含む前:#define _GLIBCXX_USE_CXX11_ABI 0

+1

私はこれを試しました。私はどこでもC++ 11の関数を使用してリンカエラーを取得します。おそらく、これをC++ 11とコンパイルされたhdf5ライブラリの両方で動作させる方法はないでしょう。 – jorgen

+0

私にとって、Ubuntu 14.04では、g ++ 6.2はデフォルトで0に設定され、16.04では同じg ++バージョンが1に設定されてコンパイルされます.14.04では、これを1に設定しても実際には何もしません。結果のオブジェクトファイルはCXX11 ABIを使用していません。私はこれがシステムの限界だと思う。 –

+0

なぜコンパイラが '未定義の参照 'を投げているのか分かりませんでした。解決策を探す前に私はプログラム内のリンケージ全体をチェックして何も見つけられませんでした。その後、私はウェブ上で検索することに決め、これを見つけました。それは魅力、感謝のように動作します:) – Shravan40

29

あなたが使用するすべての互換性のないLIBSを再コンパイルすることができた場合は、コンパイラオプションでそれを行います

-D_GLIBCXX_USE_CXX11_ABI = 1

プロジェクトを再構築します。あなたがそうすることができない場合は、

-D_GLIBCXX_USE_CXX11_ABI = 0

0/1

の#define _GLIBCXX_USE_CXX11_ABIを定義し、プロジェクトのメイクファイルのコンパイラオプションに追加

も良いですが、コンパイラオプションがすべてのファイルに対して同時に実行する間に、すべてのファイルに追加する必要があります。

+1

コンパイラの旗が私のために働いた。ありがとう。私はgccのこの愚かな変化のために4日間を無駄にしました! –

+0

ありがとうございます。この旗も私のために働いた – hbobenicio

0

私はこれを解決するために私が見つけた唯一の方法は、すべてのmingw-64を更新することでした(私はあなたの情報のためにmsys2のpacmanを使ってこれを行いました)。

関連する問題