2011-01-26 73 views
6

我正在編譯一個項目使用Cygwin(GCC v4.5.0),我有一個奇怪的鏈接器問題。我希望有一些專業人士可以提供幫助。 -std=c++0x 它成功的時候,我不指定標準: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> >&&)

然而,只有鏈接時我編譯gcc編譯器標誌失敗。

一些注意事項:

  1. 我通知GCC到標準庫與編譯器標誌手動鏈接:-lstdc++
  2. 符號依賴性被從升壓庫頭文件始發(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

有出錯了錯誤的文字。你是直接引用它的嗎?這沒有任何意義。 – 2011-01-26 18:22:49

+0

@Noah:你是指「&&」?這看起來像來自C++ 0x的右值引用符號。 – 2011-01-26 18:35:20

回答

8

是,標準和技術報告的兩個新版本做出了標準庫的內容很多變化。您引用的函數(std::string移動構造函數)是在C++ 0x的標準庫中新添加的。

儘管編譯器版本支持,但標準版本並不影響名稱修改,並且需要更新的編譯器以獲得更好的C++ 0x支持,因此它可能看起來是相關的。

您可能正在使用過舊版本的libstdC++。

編輯:基本故障排除:

$ 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這個名字不應該永遠存活到mangling階段,因爲它只是一個typedef。

不過,我得到在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> >&&)