C std库链接不同的C标准

前端之家收集整理的这篇文章主要介绍了C std库链接不同的C标准前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用Cygwin编译一个项目(GCC v4.5.0),我遇到了奇怪的链接器问题.我希望有一些专业知识的人可以提供帮助.

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

解决方法

是的,标准和技术报告的新版本都对标准库的内容进行了许多更改.您引用的函数(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::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> >&&)

猜你在找的C&C++相关文章