无法解析的std :: __ cxx11 :: basic_string ::〜basic_string和std :: allocator <char> ::〜allocator()符号

时间:2019-08-16 11:41:52

标签: c++11 gcc raspberry-pi cross-compiling

我正在尝试使用Qt5.5.1将QtWebApp编译到最新的RPI4-Raspbian Buster上,并且遇到了无法解释的GLIBCXX无法解析的符号

有效的方法:使用在Raspbian Buster上本机编译的qt5.5.1二进制文件,从Windows交叉编译到Windows的QtWebApp可以很好地与以下组件配合使用

  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上本地编译(这是我想要的开发环境)时,编译奇怪地失败,并显示以下错误:

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

我尝试过的事情(正在做的工作)

1)遵循Converting std::__cxx11::string to std::string的建议并传递-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从Win10上的raspberry-gcc8.3.0.exe安装复制到RPi-4,并将其传递到gcc作为其--sysroot的位置-也会因~basic_string()未解析器错误而失败。 (尽管我按照GCC ignores --sysroot帖子中的建议检查了--sysroot输出中是否没有gcc -v,但我不知道如何验证--with_libs是否有效)

信息:除了使用gcc且未传递-IC:/SysGCC/raspberry/arm-linux-gnueabihf/sysroot/opt/vc/include之外,命令行在RPI4-Buster上完全相同

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

我坚持了2天。请提出其他可以在这里尝试的步骤。

1 个答案:

答案 0 :(得分:1)

  • 您是否以gcc而不是g++的身份执行编译器?那会引起这个问题。调用g++
  • 否则,请尝试在链接标志中添加-lstdc++

说明:

这些符号显然来自C ++标准库。在某些情况下-至少,当您使用gcc二进制而不是g++调用GCC时-GCC会编译C ++代码,但不会自动链接到GNU C ++标准库。如果由于某些原因不能通过调用g++解决此问题,则可以尝试添加-lstdc++标志,这意味着“应该链接到库libstdc++.solibstdc++.a在图书馆搜索路径中找到”。