gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:25:48 25 4
gpt4 key购买 nike

我正在使用 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::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

最佳答案

是的,新修订的标准和技术报告都对标准库的内容做了很多改动。您引用的函数(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不应该存活到处理阶段,因为它只是一个 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> >&&)

关于与不同 C++ 标准链接的 C++ std 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4808165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com