2011-01-26 37 views
6

私はCygwin(GCC v4.5.0)を使用してプロジェクトをコンパイルしていますが、奇妙なリンカの問題があります。私はいくつかの専門知識を持つ誰かが助けることを望んでいます。私はGCCコンパイラフラグを使用してコンパイルするとき異なるC++標準とリンクするC++標準ライブラリ

Error: undefined reference to std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&&)

しかし、リンクのみが失敗します。 -std=c++0x それは私が標準を指定しないとき成功します。

いくつかの注意:

  1. 私はコンパイラフラグを使用して手動で標準ライブラリをリンクするためのgccを通知しています:-lstdc++
  2. シンボル依存性はBoostライブラリのヘッダファイル(v.1.45.0)から発信されます: boost::units::detail::utility.hpp, function: std::string demangle(const char* name);
  3. このアプリケーションは、MinGW gcc v4.5.0を使用して正しくコンパイルしてリンクします。

質問:

  1. コンパイル標準ライブラリは通常、別のC++標準の異なる記号が含まれていますか?
  2. GCCのシンボルの名前のマングリングは、異なるC++標準によって変更されますか?
  3. std::basic_stringのシンボルは、libstdc++.aが見つかると保証できないのはなぜですか?

ありがとうございます。

-jt

+0

あなたのエラーテキストに何か問題があります。あなたはそれを直接引用しましたか?それは意味をなさない。 –

+0

@ノア:あなたは "&&"を指していますか?これは、C++ 0xのrvalue参照表記のように見えます。 –

答えて

8

はい、標準の新しいリビジョンと技術レポートの両方が標準ライブラリの内容に多くの変更を行います。 C++ 0xの標準ライブラリで参照した関数(std::string移動コンストラクタ)が新たに追加されました。

標準のバージョンは名前のマングリングには影響しませんが、コンパイラのバージョンには影響しませんが、C++ 0xのサポートを強化するためには新しいコンパイラが必要です。

おそらく古いバージョンのlibstdC++を使用している可能性があります。

EDIT:基本的なトラブルシューティング:

$ find /usr -name libstdc++.a 
/usr/lib/gcc/i686-pc-cygwin/4.5.0/libstdc++.a 

$ cygcheck -f /usr/lib/gcc/i686-pc-cygwin/4.5.0/libstdc++.a 
libstdc++6-devel-4.5.0-1 

$ nm -C /usr/lib/gcc/i686-pc-cygwin/4.5.0/libstdc++.a | grep basic_string | grep '&&' 
00000000 T std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string&&) 
00000000 T std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string&&) 
00000000 T std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::assign(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&&) 
00000000 T std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::basic_string(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&&) 
00000000 T std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::basic_string(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&&) 
00000000 T std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::operator=(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&&) 

これは確かにちょっと面白い見えません。 std::wstring(つまりstd::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >)の定義が正しいように見えますが、狭いバージョンでは正しくありません。 std::stringという名前は、単なるtypedefなので、mangling段階まで生き残ってはいけません。

はしかし、私は、Linux上で同じ出力を得る:

% find /usr -name libstdc++.a 
/usr/lib64/gcc/x86_64-pc-linux-gnu/3.4.6/libstdc++.a 
/usr/lib64/gcc/x86_64-pc-linux-gnu/3.4.6/32/libstdc++.a 
/usr/lib64/gcc/x86_64-pc-linux-gnu/4.5.2/libstdc++.a 
/usr/lib64/gcc/x86_64-pc-linux-gnu/4.5.2/32/libstdc++.a 

% nm -C /usr/lib64/gcc/x86_64-pc-linux-gnu/4.5.2/libstdc++.a | grep basic_string | grep '&&' 
0000000000000000 W std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string&&) 
0000000000000000 W std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string&&) 
0000000000000000 W std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::assign(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&&) 
0000000000000000 W std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::basic_string(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&&) 
0000000000000000 W std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::basic_string(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&&) 
0000000000000000 W std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::operator=(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&&) 
+0

ええと..そうすれば、おそらくGCC v.4.5.0のcygwin版に欠陥があるのでしょうか? –

+1

g ++の実験版をインストールしたときに、 'libstdC++ 6-devel'のv4.5も手に入れましたか?そのバージョンを確認するために必要なコマンドを私の答えに加えました。 –

+1

ああ、それを修正します。 Benありがとう。私はlibstdC++ 6-develをインストールしていませんでした。 cygwinはプロセスのエラーを起こしにくくするために、より多くのドキュメントを提供していないことは残念です。 –

関連する問題