未解决的 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 可以很好地处理以下组件
工具链:raspberry-gcc8.3.0.exe 安装在 Windows 10.
Qt 二进制库:本机编译于 RPI4 Raspbian Buster OS 和
复制到 Windows 10.
命令行:
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".
我正在尝试使用 Qt5.5.1 将 QtWebApp 编译到最新的 RPI4-Raspbian Buster 上,我遇到了莫名其妙的 GLIBCXX 未解析符号
什么有效:QtWebApp 使用在 Raspbian 上本机编译的 qt5.5.1 二进制文件从 windows 交叉编译到 armhf Buster 可以很好地处理以下组件
工具链:raspberry-gcc8.3.0.exe 安装在 Windows 10.
Qt 二进制库:本机编译于 RPI4 Raspbian Buster OS 和 复制到 Windows 10.
命令行:
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
问题: 使用 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".