Error: undefined reference to
std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string(std::basic_string<char,std::allocator<char> >&&)
但是,当我使用gcc编译器标志进行编译时,链接才会失败:
-std = c 0x
当我没有指定标准时,它会成功.
一些说明:
>我通知gcc手动链接标准库和编译器标志:-lstdc
>符号依赖性源自Boost库头文件(v.1.45.0):
boost :: units :: detail :: utility.hpp,function:std :: string demangle(const char * name);
>应用程序使用MinGW gcc v4.5.0正确编译和链接.
问题:
>编译后的标准库通常是否包含不同C标准的不同符号?
> GCC中符号名称的变化是否随着C标准的不同而变化?
>为什么链接器找不到std :: basic_string的符号,我可以保证它能找到libstdc .a?
在此先感谢大家.
-jt
解决方法
该标准的版本不影响名称修改,虽然编译器版本确实如此,并且需要更新的编译器以获得更好的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::allocator<char> >::basic_string(std::string&&) 00000000 T std::basic_string<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::allocator<wchar_t> >&&) 00000000 T std::basic_string<wchar_t,std::allocator<wchar_t> >::basic_string(std::basic_string<wchar_t,std::allocator<wchar_t> >::operator=(std::basic_string<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::allocator<char> >::basic_string(std::string&&) 0000000000000000 W std::basic_string<char,std::allocator<char> >::basic_string(std::string&&) 0000000000000000 W std::basic_string<wchar_t,std::allocator<wchar_t> >&&) 0000000000000000 W std::basic_string<wchar_t,std::allocator<wchar_t> >&&)