我正在尝试使用Qt5.5.1将QtWebApp编译到最新的RPI4-Raspbian Buster上,并且遇到了无法解释的GLIBCXX无法解析的符号
有效的方法:使用在Raspbian Buster上本机编译的qt5.5.1二进制文件,从Windows交叉编译到Windows的QtWebApp可以很好地与以下组件配合使用
工具链: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上本地编译(这是我想要的开发环境)时,编译奇怪地失败,并显示以下错误:
/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天。请提出其他可以在这里尝试的步骤。
答案 0 :(得分:1)
gcc
而不是g++
的身份执行编译器?那会引起这个问题。调用g++
。-lstdc++
。说明:
这些符号显然来自C ++标准库。在某些情况下-至少,当您使用gcc
二进制而不是g++
调用GCC时-GCC会编译C ++代码,但不会自动链接到GNU C ++标准库。如果由于某些原因不能通过调用g++
解决此问题,则可以尝试添加-lstdc++
标志,这意味着“应该链接到库libstdc++.so
或libstdc++.a
在图书馆搜索路径中找到”。