【问题标题】:C++ std library linking with different C++ standards与不同 C++ 标准链接的 C++ 标准库
【发布时间】:2011-06-16 01:00:49
【问题描述】:

我正在使用 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. 我可以保证可以找到libstdc++.a,为什么链接器却找不到std::basic_string的符号?

提前谢谢大家。

-JT

【问题讨论】:

  • 您的错误文本有问题。你是直接引用的吗?这没有任何意义。
  • @Noah:你指的是“&&”吗?这看起来像来自 C++0x 的右值引用表示法。

标签: c++ gcc c++11 linker cygwin


【解决方案1】:

是的,标准和技术报告的新修订版都对标准库的内容进行了许多更改。您引用的函数(std::stringmove 构造函数)是新添加到 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&lt;wchar_t, std::char_traits&lt;wchar_t&gt;, std::allocator&lt;wchar_t&gt; &gt;)的定义看起来是正确的,而窄版本则不然。 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> >&&)

【讨论】:

  • 嗯.. 这表明 GCC v.4.5.0 的 cygwin 版本可能存在缺陷?
  • 你在安装g++实验版的时候,是不是也得到了libstdc++6-devel的v4.5?刚刚在我的答案中添加了检查该版本所需的命令。
  • 啊,解决了它。非常感谢本。我没有安装 libstdc++6-devel。不幸的是 cygwin 没有提供更多的文档来使这个过程更不容易出错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-19
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
  • 2017-03-16
相关资源
最近更新 更多