未解决的 std::__cxx11::basic_string::~basic_string 和 std::allocator<char>::~allocator() 符号

unresolved std::__cxx11::basic_string::~basic_string and std::allocator<char>::~allocator() symbols

我正在尝试使用 Qt5.5.1 将 QtWebApp 编译到最新的 RPI4-Raspbian Buster 上,我遇到了莫名其妙的 GLIBCXX 未解析符号

什么有效:QtWebApp 使用在 Raspbian 上本机编译的 qt5.5.1 二进制文件从 windows 交叉编译到 armhf Buster 可以很好地处理以下组件

  1. 工具链:raspberry-gcc8.3.0.exe 安装在 Windows 10.

  2. Qt 二进制库:本机编译于 RPI4 Raspbian Buster OS 和 复制到 Windows 10.

  3. 命令行: c:/SysGCC/raspberry/bin/arm-linux-gnueabihf-g++.exe -std=c++11 -fPIC -I. {ALL QT INCLUDE DIRS} -IC:/SysGCC/raspberry/arm-linux-gnueabihf/sysroot/opt/vc/include -g -rdynamic -funwind-tables -Woverflow {ALL QTWEB SOURCE FILES} -LC:/SysGCC/pi4/pi4qt551/lib -lQt5Core -lQt5Gui -lQt5Widgets -lQt5Multimedia -lQt5MultimediaWidgets -lQt5Network -lm -lpthread -o qtweb

这会生成一个在 RPI-4 上运行良好的 arm 可执行文件。

什么失败了

在 RPI4 上本地编译 (这是我想要的开发环境) 时,编译 st运行gely 失败并出现以下错误:

/usr/bin/ld: /tmp/ccnnsRCD.o: undefined reference to symbol '_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4.21'

我试过的方法(没用)

1) 遵循 的建议并传递 -D_GLIBCXX_USE_CXX11_ABI=0 它失败并出现以下错误:

/usr/bin/ld: /tmp/ccZfI5co.o: undefined reference to symbol '_ZNSaIcED1Ev@@GLIBCXX_3.4'

这些符号分别分解为 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()std::allocator<char>::~allocator()

2) 我也 运行 所有组合 WITH/WITHOUT -std=c++11 and D_GLIBCXX_USE_CXX11_ABI=0 这些是错误

WITH  -std=c++11, WITHOUT -D_GLIBCXX_USE_CXX11_ABI=0 
/usr/bin/ld: /tmp/ccnnsRCD.o: undefined reference to symbol '_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4.21'

 WITH -std=c++11, WITH -D_GLIBCXX_USE_CXX11_ABI=0 
/usr/bin/ld: /tmp/ccZfI5co.o: undefined reference to symbol '_ZNSaIcED1Ev@@GLIBCXX_3.4'

 WITHOUT -std=c++11, WITH -D_GLIBCXX_USE_CXX11_ABI=0 
/usr/bin/ld: /tmp/cctFncwz.o: undefined reference to symbol '_ZNSaIcED1Ev@@GLIBCXX_3.4'

 WITHOUT -std=c++11, WITHOUT -D_GLIBCXX_USE_CXX11_ABI=0 
/usr/bin/ld: /tmp/cchkJYdO.o: undefined reference to symbol '_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4.21'

3) 我还将 sysroot 从 raspberry-gcc8.3.0.exe 安装在 Win10 上复制到 RPi-4,并将其传递给 gcc 作为其 --sysroot location - 也因 ~basic_string() unresolver 错误而失败。 (我不知道如何验证 --sysroot 是否有任何影响,尽管我检查了 gcc -v 输出中没有 --with_libs,正如 GCC 忽略 --sysroot 中所建议的 post)

信息:除了使用 gcc 和不传递 -IC:/SysGCC/raspberry/arm-linux-gnueabihf/sysroot/opt/vc/include

之外,命令行在 RPI4-Buster 上完全相同

问题: 使用 gcc 8.3 工具链从 windows 到 arm-linux 进行交叉编译是如何工作的(假设没有明显的编译选项不匹配;)但是在 raspbian buster 上本地编译时相同的代码库gcc 8.3 失败,Raspbian Buster OS 二进制文件中的 GLIBCXX 版本不匹配 ?

我已经坚持了 2 天了。请建议我可以在这里尝试的任何其他步骤。

  • 您是否将编译器执行为 gcc 而不是 g++?那会导致这个问题。调用 g++.
  • 否则,请尝试将 -lstdc++ 添加到您的 link 标记中。

解释:

这些符号显然来自 C++ 标准库。在某些情况下 - 至少,当您使用 gcc 二进制而不是 g++ 调用 GCC 时 - GCC 编译 C++ 代码,但不会自动 link 针对 GNU C++ 标准库.如果出于某种原因无法通过调用 g++ 解决此问题,您可以尝试添加 -lstdc++ 标志,这意味着 "link against the library libstdc++.so or libstdc++.a which you should find in the library search path".