2011-01-26 109 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> >&&)