C++ std库链接不同的C++标准

J T*_*J T 6 c++ linker gcc cygwin c++11

我正在使用Cygwin编译一个项目(GCC v4.5.0),我遇到了奇怪的链接器问题.我希望有一些专业知识的人可以提供帮助.

错误:未定义引用 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编译器标志进行编译时,链接才会失败: -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

Ben*_*igt 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> >&&)
Run Code Online (Sandbox Code Playgroud)

这看起来确实有点滑稽.std::wstring(即std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >)看起来正确的定义,窄版本没有.这个名字std::string永远不会幸存到破败阶段,因为它只是一个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> >&&)
Run Code Online (Sandbox Code Playgroud)